我在继承的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
答案 0 :(得分:0)
您无法将背景显式设置为白色,然后使用样式应用值覆盖它。样式值比所谓的本地值“弱”,并且永远不会覆盖它。只需将您的白色背景设置移动到样式中即可。它可以正常工作。