【问题标题】:Get WPF resource from code?从代码中获取 WPF 资源?
【发布时间】:2010-08-05 00:46:02
【问题描述】:

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

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

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

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

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

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

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

【问题讨论】:

    标签: wpf resources


    【解决方案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,以根据@987654331 的属性控制TextBox 设置@。

    请注意,我还在Triggers 集合之外使用了Setter 来设置默认值,并且当CheckBox 未被选中时,我不需要第二个Setter——它只是回到“默认”状态。

    编辑 - 如何更改禁用 TextBox 的背景

    我在 Blend 中执行此操作,但如果您没有 Blend,您当然可以直接将 XAML 放入。这与控制状态有关。当TextBoxNormalMouseOverDisabled 之间转换时,您可以对外观进行动画更改。在这种情况下,我们使用持续时间几乎为零的动画,因此更改是即时的。

    将以下内容添加到StackPanel

        <VisualStateManager.VisualStateGroups>
            <VisualStateGroup x:Name="VisualStateGroup">
                <VisualState x:Name="Disabled">
                    <Storyboard>
                        <ColorAnimationUsingKeyFrames BeginTime="00:00:00" Duration="00:00:00.0010000" Storyboard.TargetName="textbox" Storyboard.TargetProperty="(Panel.Background).(SolidColorBrush.Color)">
                            <SplineColorKeyFrame KeyTime="00:00:00" Value="{StaticResource IsCheckedColor}"/>
                        </ColorAnimationUsingKeyFrames>
                    </Storyboard>
                </VisualState>
            </VisualStateGroup>
        </VisualStateManager.VisualStateGroups>
    

    【讨论】:

    • 感谢关于触发器的建议——我会接受答案。但是,标记并不完全有效。显然,当您禁用文本框时,它会丢失您分配给它的任何背景颜色。所以,我可以禁用文本框,但不能更改它的背景颜色。
    • @David 我更新了答案,展示了如何在 TextBox 被禁用时更改其背景颜色。
    【解决方案2】:

    这种方法是窗体 Windows 窗体,这对于 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 范围或窗口中的后台存储。触发器是 Freezable 对象,因此 GUI 会自行刷新(不需要 repaint())

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

    【讨论】:

    • 这不起作用并且会给你一个运行时异常。您不能将绑定用于分配给 Setter 属性的值。
    猜你喜欢
    • 1970-01-01
    • 2010-10-20
    • 1970-01-01
    • 2011-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多