从代码中获取WPF资源?

时间:2010-08-05 00:46:02

标签: wpf resources

从代码中获取WPF资源的最简单方法是什么?

如果选中同一窗口中的复选框,我需要禁用WPF表单中的文本框。我已将复选框连接到代码隐藏中的事件处理程序。事件处理程序禁用复选框并将其背景更改为浅灰色,以指示控件已禁用:

private void OnCheckBoxChecked(object sender, RoutedEventArgs e)
{
    MyTextBox.IsEnabled = false;
    MyTextBox.Background = (Brush)FindResource("DisabledControlBackgroundBrush");
}

禁用的控件背景颜色被定义为导入WPF窗口的资源字典中的资源。我通过在XAML中设置文本框背景来测试资源,并且资源正常工作。

我也知道事件处理程序正在运行,因为它在单击复选框时禁用了文本框。

我的问题是事件处理程序没有按原样更改Background属性。我怀疑我对FindResource的调用存在问题,但我没有得到异常,并且“输出”窗口中没有任何内容。

那么,如何从代码中获取此资源并将其应用到我的文本框中?谢谢你的帮助。

2 个答案:

答案 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。这与控制状态有关。随着TextBoxTextBoxNormal之间的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())

尝试获得一些概述,因为它是开发应用程序的新方法:)