Граница вокруг ListView, когда IsEnabled имеет значение false - PullRequest
0 голосов
/ 26 января 2012

При установке IsEnabled на False на ListView я получаю границу толщиной в один пиксель вокруг элемента управления с цветом #F0F0F0 (на Win7).

Я подозреваю, что этоодин из SystemColors включается. Как мне установить эти границы BorderThickness на 0 или, если это не так, какой из SystemColors я должен переопределить в своем стиле, чтобы изменить его так же, как фон управления?

Я уверен, что здесь есть лишние строки, потому что я добавлял и удалял вещи, пытаясь решить проблему

<ListView ItemsSource="{Binding Path=Types}" SelectedItem="{Binding Path=SelectedType}" Height="Auto" Width="Auto" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" IsEnabled="{Binding Path=TypeCategoryIsSelected}" ItemContainerStyle="{StaticResource LVItemStyle}" BorderThickness="0" Background="{StaticResource aBackground}" SelectionMode="Single">


</ListView>

<SolidColorBrush x:Key="aBackground" Color="#FFFFE7" />

<DataTemplate x:Key="tDefaultTemplate">
    <Border BorderBrush="#CDCDCD" BorderThickness="1" Background="#FFFFFF" Width="325" Margin="15,2,15,2" HorizontalAlignment="Stretch">
        <DockPanel Margin="1,1,1,1" Height="28" HorizontalAlignment="Stretch" Width="Auto">
            <DockPanel.Background>
                <LinearGradientBrush StartPoint="1,0" EndPoint="1,1">
                    <GradientStop Color="#F2EFEF" Offset="0.0" />
                    <GradientStop Color="#F6F5F5" Offset="0.5" />
                    <GradientStop Color="#F8F8F8" Offset="1.0" />
                </LinearGradientBrush>
            </DockPanel.Background>
            <TextBlock Margin="20,0,0,0" DockPanel.Dock="Left" Foreground="Black" HorizontalAlignment="Left" VerticalAlignment="Center" Text="{Binding Path=Name}" />
        </DockPanel>
    </Border>
</DataTemplate>

<DataTemplate x:Key="tSelectedTemplate">
    <Border BorderBrush="#DDA4AB" BorderThickness="1" Background="#FFFFFF" Width="325" Margin="15,2,15,2" HorizontalAlignment="Stretch">
        <DockPanel Margin="1,1,1,1" Height="28" HorizontalAlignment="Stretch" Width="Auto">
            <DockPanel.Background>
                <LinearGradientBrush StartPoint="1,0" EndPoint="1,1">
                    <GradientStop Color="#FFE0E3" Offset="0.0" />
                    <GradientStop Color="#FFE8EA" Offset="0.5" />
                    <GradientStop Color="#F6EAEB" Offset="1.0" />
                </LinearGradientBrush>
            </DockPanel.Background>
            <TextBlock Margin="20,0,0,0" DockPanel.Dock="Left" Foreground="Black" HorizontalAlignment="Left" VerticalAlignment="Center" Text="{Binding Path=Name}" />
        </DockPanel>
    </Border>
</DataTemplate>

<Style TargetType="{x:Type ListViewItem}" x:Key="LVItemStyle">
    <Setter Property="ContentTemplate" Value="{StaticResource tDefaultTemplate}" />
    <Style.Resources>
        <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="#FFFFE7"/>
        <SolidColorBrush x:Key="{x:Static SystemColors.ControlBrushKey}" Color="#FFFFE7" />
    </Style.Resources>
    <Style.Triggers>
        <Trigger Property="IsSelected" Value="True">
            <Setter Property="ContentTemplate" Value="{StaticResource tSelectedTemplate}" />
        </Trigger>
        <Trigger Property="IsEnabled" Value="False">
            <Setter Property="Background" Value="{StaticResource aBackground}" />
        </Trigger>
    </Style.Triggers>
</Style>

<Style TargetType="{x:Type ListView}" x:Key="LVStyle">
    <Setter Property="Background" Value="{StaticResource aBackground}" />
    <Setter Property="BorderThickness" Value="0" />
    <Style.Resources>
        <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="#FFFFE7"/>
    </Style.Resources>
    <Style.Triggers>
        <Trigger Property="IsEnabled" Value="False">
            <Setter Property="BorderBrush" Value="#FFFFE7"/>
            <Setter Property="Background" Value="{StaticResource aBackground}" />
        </Trigger>
    </Style.Triggers>
</Style>

1 Ответ

1 голос
/ 26 января 2012

Хорошо, я провел некоторое исследование и смог найти причину проблемы (и разрешение во время выполнения). Однако у меня закончилось время, поэтому я покажу свои выводы в надежде, что вы сможете закончить расследование.

Во-первых, я использовал инструмент под названием Snoop , который позволяет вам копаться в визуализированном WPF, просматривать значения всех элементов управления и отображать каждый слой. Используя это, мне удалось обнаружить, что ваш ListView элемент управления содержит Border элемент управления. Это Border имеет значение Padding, равное 1, отсюда ваша граница (см. Ниже). Используя возможность изменения значений свойств среды выполнения Snoop, я установил значение 0 и, конечно же, граница исчезла.

Cause of issue as seen through Snoop

Скорее всего, вы можете контролировать это в вашем Style где-нибудь. Либо это, либо, возможно, один из стилей, которые вы уже используете, вызывает это. Я бы попробовал это на ListView без чего-либо установленного (кроме некоторых основных предметов, размера и отключенных). Это может помочь вам определить, является ли это чем-то, что вы вызвали, или чем-то внутренним в элементе управления ListView.

Если вы не можете найти способ исправить эту проблему напрямую, вы можете попробовать шаблонизировать свой ListView элемент управления, создав собственный ControlTemplate, который затем даст вам полный контроль над тем, как он отображается (хотя это может оказаться довольно трудоемким).

...