代码之家  ›  专栏  ›  技术社区  ›  David Veeneman

从代码中获取WPF资源?

  •  4
  • David Veeneman  · 技术社区  · 14 年前

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

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

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

    禁用的控件背景色定义为导入WPF窗口的资源字典中的资源。我通过在XAML中设置textbox背景来测试资源,资源运行良好。

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

    我的问题是事件处理程序没有按它应该的那样更改Background属性。我怀疑我对FindResource的调用有问题,但是我没有得到异常,而且输出窗口上没有任何内容。

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

    2 回复  |  直到 14 年前
        1
  •  1
  •   Community Ramakrishna.p    4 年前

    大卫。我已经创建了一个示例窗口,它使用 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 你可以用普通的 它可以用来控制动画,以及 DataTrigger ,我在这个示例中使用它来控制 TextBox 基于属性的设置 CheckBox .

    Setter 外面的 集合来设置默认值,我不需要任何时间 塞特 没有被选中——它只是返回到“默认”状态。

    我在Blend中做这个,但是如果你没有Blend,你当然可以直接把XAML放进去。这与控制状态有关。作为 文本框 Normal MouseOver ,和 Disabled ,可以设置外观更改的动画。在本例中,我们使用了一个几乎为零持续时间的动画,因此更改是即时的。

    将以下内容添加到 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>
    
        2
  •  -1
  •   Lukasz Madon    14 年前

    这种方法是窗体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> 
    

    应用程序资源范围或窗口中的后台存储。触发器是可释放的对象,因此GUI将刷新自身(不需要repaint())

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