从代码中获取WPF资源的最简单方法是什么?
如果选中同一窗口中的复选框,我需要禁用WPF表单中的文本框。我已将复选框连接到代码隐藏中的事件处理程序。事件处理程序禁用复选框并将其背景更改为浅灰色,以指示控件已禁用:
private void OnCheckBoxChecked(object sender, RoutedEventArgs e)
{
MyTextBox.IsEnabled = false;
MyTextBox.Background = (Brush)FindResource("DisabledControlBackgroundBrush");
}
禁用的控件背景颜色被定义为导入WPF窗口的资源字典中的资源。我通过在XAML中设置文本框背景来测试资源,并且资源正常工作。
我也知道事件处理程序正在运行,因为它在单击复选框时禁用了文本框。
我的问题是事件处理程序没有按原样更改Background属性。我怀疑我对FindResource的调用存在问题,但我没有得到异常,并且“输出”窗口中没有任何内容。
那么,如何从代码中获取此资源并将其应用到我的文本框中?谢谢你的帮助。
答案 0 :(得分:1)
大卫。我已经整理了一个示例窗口,它使用TextBox.Style
上的触发器来执行此操作:
<Window x:Class="WpfApplication1.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1">
<Window.Resources>
<SolidColorBrush x:Key="IsCheckedColor" Color="DarkGray" />
</Window.Resources>
<StackPanel>
<TextBox x:Name="textbox" Margin="36" Height="24" >
<TextBox.Style>
<Style TargetType="TextBox">
<Setter Property="Background" Value="White" />
<Style.Triggers>
<DataTrigger Binding="{Binding IsChecked, ElementName=checkbox}" Value="True" >
<Setter Property="Background" Value="{StaticResource IsCheckedColor}" />
<Setter Property="IsEnabled" Value="False" />
</DataTrigger>
</Style.Triggers>
</Style>
</TextBox.Style>
</TextBox>
<CheckBox x:Name="checkbox" Content="Click Me" Height="24" Margin="36"/>
</StackPanel>
</Window>
您无法使用Trigger
更改其他控件的属性,但您可以使用它们根据其他内容更改控件的属性,例如DataContext
或其他控件。
每个控件都可以有一个Triggers
集合,但这只能包含EventTriggers
。在Style
中,您可以使用可用于控制动画的普通Trigger
以及我在此示例中用于控制DataTrigger
设置的TextBox
基于CheckBox
。
请注意,我还使用了Setter
集合之外的Triggers
来设置默认值,而{{1}时我不需要第二个Setter
未检查 - 它只是回到“默认”状态。
CheckBox
我在Blend中这样做,但是如果你没有Blend,你当然可以直接放入XAML。这与控制状态有关。随着TextBox
,TextBox
和Normal
之间的MouseOver
转换,您可以对外观进行动画处理。在这种情况下,我们使用几乎为零持续时间的动画,因此立即进行更改。
将以下内容添加到Disabled
:
StackPanel
答案 1 :(得分:-1)
这种方法是Windows Forms的形式,这对WPF来说是一种糟糕的模式。您想要做的就是触发器和样式 彭定康:
<Style x:Key="BackGroundCheckBoxStyle"> < !--apply the style to checkbox -->
<Style.Triggers>
<Trigger Property="IsChecked" Value="True">
<Setter Property="{Binding ElementName=m_txtBox, Path=IsEnabled, Mode=TwoWay}" Value="false}" />
<!-- bind your resource here with a setter as well -->
</Trigger>
</Style.Triggers>
</Style>
Aplication.Resources范围或Window中的后台存储。触发器是Freezable对象,因此GUI将自行刷新(不需要repaint())
尝试获得一些概述,因为它是开发应用程序的新方法:)