WPF:在XAML中禁用控件时,无法设置自定义控件的背景颜色

时间:2011-04-21 21:05:27

标签: wpf xaml wpf-controls

我在继承的WPF / C#项目中有一个自定义的IPAddressBox控件。该控件运行良好,但它不允许我在禁用控件时更改XAML中的背景(我可以通过后面的代码成功更改它,但我正在拼命地打破UI和业务逻辑之间的耦合并且想要远离“了解我的业务代码中的每个UI细节”

我根据选择的组合框启用/禁用了几个控件 - 组合是一个备份位置 - 有2个选项 - DVD-RW或网络。如果他们选择网络,我有一个IPAddress控件和凭据的文本/密码控件。我可以通过绑定类中的IsEnabled属性来成功启用/禁用控件,但我似乎无法将IP控件的背景变为灰色。我拥有控件的所有代码(XAML& CS)以及我自己的代码 - 我对WPF很新,并且我正在尝试学习正确的事情而不是立即将所有事件路由到CS并在那里进行....

以下是我的(最新)尝试更改背景的XAML的一部分:

<automation:IPAddressBox  Grid.Column=" 4" Grid.Row="4"                 
 Name="ipAddressBox_BackupIpAddress" Background="White" 
 IsEnabled="{Binding Path=IsBackupEnabled}">

 <automation:IPAddressBox.Style>
      <Style TargetType="{x:Type automation:IPAddressBox}">
      <Style.Triggers>
          <DataTrigger Binding="{Binding Path=IsBackkupEnabled}" Value="false">
        <Setter Property="Background" Value="LightGray"/>
         </DataTrigger>
     </Style.Triggers>
     </Style>
  </automation:IPAddressBox.Style>
</automation:IPAddressBox> "

<-- Other related controls -->

<Label Grid.Column="6" Grid.Row="2" Name="label_BackupUserID" Content="User ID:" 
       HorizontalAlignment="Right" IsEnabled="{Binding Path=IsBackupEnabled}" />

<TextBox Grid.Column="8" Grid.Row="2" Name="txtBackupUserID" 
     IsEnabled="{Binding Path=IsBackupEnabled}" />

<Label Grid.Column="6" Grid.Row="4" Name="label_BackupPassword" Content="Password:" 
       HorizontalAlignment="Right" IsEnabled="{Binding Path=IsBackupEnabled}" />

<PasswordBox Grid.Column="8" Grid.Row="4" Name="passwordBox_BackupPassword" 
       IsEnabled="{Binding Path=IsBackupEnabled}" />

请注意,由于某种原因,我将背景颜色设置为白色,因为基本控件是“透明的”。我已经在控制器和我自己的代码中尝试了各种样式/触发器,所有这些都没有运气我做的事情 - 这是将背景变为灰色

- 这是控件XAML供参考 - 我不确定我是否需要包含控件上可用的公共属性,基本上还有2个感兴趣 - 前景(类型画笔)和BorderBrush(也类型画笔) - 我尝试将IsEnabled添加到控件的属性上,尝试更改背景 - 再次没有运气 - 唯一可以工作的地方是“我的代码中的组合框的OnSelectionChanged。”

这是IpAddressBox的简化xaml(我删除了一些显示无效值的Popup)

<UserControl.Resources>
  <Style x:Key="textBoxStyle" TargetType="{x:Type TextBoxBase}">
    <Setter Property="OverridesDefaultStyle" Value="True" />
       <Setter Property="Template">
       <Setter.Value>
           <ControlTemplate TargetType="{x:Type TextBoxBase}">
          <ScrollViewer x:Name="PART_ContentHost" Margin="0,3,0,0" />
           </ControlTemplate>
       </Setter.Value>
       </Setter/>
   </Style>
</UserControl.Resources>

<Border Name="border_IpAddressBox" BorderBrush="Black" BorderThickness="1">
   <Grid>
      <automation:NumericTextBox Height="23" x:Name="numericTextBox1" Width="30" 
      MinWidth="30" MaxWidth="30" HorizontalAlignment="Left" VerticalAlignment="Top"
      BorderBrush="Transparent" MaxLength="3" HorizontalContentAlignment="Center"
      ContextMenu="{StaticResource contextMenu_TextBox}" Background="Transparent" 
      Style="{StaticResource textBoxStyle}" />

     <automation:NumericTextBox Height="23" Margin="42,0,0,0" x:Name="numericTextBox2" 
       VerticalAlignment="Top" HorizontalAlignment="Left" Width="30" MinWidth="30" 
       MaxWidth="30" BorderBrush="Transparent" MaxLength="3" 
       HorizontalContentAlignment="Center" ContextMenu="{StaticResource 
       contextMenu_TextBox}" Background="Transparent" 
       Style="{StaticResource textBoxStyle}" IsTabStop="False" />

     <automation:NumericTextBox Height="23" Margin="84,0,0,0" x:Name="numericTextBox3" 
       VerticalAlignment="Top" HorizontalAlignment="Left" Width="30" MinWidth="30" 
       MaxWidth="30" BorderBrush="Transparent" MaxLength="3" 
       HorizontalContentAlignment="Center" ContextMenu="{StaticResource 
       contextMenu_TextBox}" Background="Transparent" Style="{StaticResource 
       textBoxStyle}" IsTabStop="False" />

     <automation:NumericTextBox Height="23" Margin="126,0,0,0" x:Name="numericTextBox4" 
       VerticalAlignment="Top" HorizontalAlignment="Left" Width="30" MinWidth="30"  
       MaxWidth="30" BorderBrush="Transparent" MaxLength="3" 
       HorizontalContentAlignment="Center" ContextMenu="{StaticResource 
       contextMenu_TextBox}" Background="Transparent" Style="{StaticResource 
       textBoxStyle}" IsTabStop="False" />

    <Label Name="label1" Height="23" Margin="30,0,0,0" VerticalAlignment="Top" 
       HorizontalAlignment="Left" Width="12">.</Label>

    <Label Name="label2" Height="23" HorizontalAlignment="Left" Margin="72,0,0,0" 
       VerticalAlignment="Top" Width="12">.</Label>

    <Label Name="label3" Height="23" HorizontalAlignment="Left" Margin="114,0,0,0" 
       VerticalAlignment="Top" Width="12">.</Label>

    </Grid>
  </Border>
</UserControl>

NumericTextBox只是另一个用户控件,它将文本输入限制为数值 - 仅限CS实现,不涉及XAML。

提前感谢您提供任何帮助 - 在软件开发方面有20年的经验,这是我发布的第一个问题 - Google通常会采用这种方式,但不是这次:)

- Brian

1 个答案:

答案 0 :(得分:0)

您无法将背景显式设置为白色,然后使用样式应用值覆盖它。样式值比所谓的本地值“弱”,并且永远不会覆盖它。只需将您的白色背景设置移动到样式中即可。它可以正常工作。