Получить ресурс WPF из кода? - PullRequest
4 голосов
/ 05 августа 2010

Какой самый простой способ получить ресурс WPF из кода?

Мне нужно отключить текстовое поле в форме WPF, если установлен флажок в том же окне. Я связал флажок с обработчиком событий в коде позади. Обработчик событий отключает флажок и меняет свой фон на светло-серый, чтобы указать, что элемент управления отключен:

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

Цвет отключенного элемента управления определяется как ресурс в словаре ресурсов, который импортируется в окно WPF. Я проверил ресурс, установив фон текстового поля в XAML, и ресурс работает нормально.

Я также знаю, что обработчик событий работает, потому что он отключает текстовое поле при нажатии флажка.

Моя проблема в том, что обработчик событий не меняет свойство Background, как должно. Я подозреваю, что есть проблема с моим вызовом FindResource, но я не получаю исключение, и в окне Output ничего нет.

Итак, как мне получить этот ресурс из кода и применить его к моему текстовому полю? Спасибо за вашу помощь.

Ответы [ 2 ]

1 голос
/ 05 августа 2010

Дэвид. Я собрал пример окна, которое делает это с помощью триггеров на 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, чтобы установить значение по умолчанию, и мне не нужна секунда Setter, когда CheckBox не отмечен - это просто возвращается в состояние «по умолчанию».

редактировать - как изменить фон отключен TextBox

Я делаю это в Blend, но если у вас нет Blend, вы, конечно, можете напрямую вставить XAML. Это связано с управлением состояниями. По мере перехода TextBox между 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>
0 голосов
/ 05 августа 2010

Такой подход основан на 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. Триггеры являются объектами Freezable, поэтому графический интерфейс обновится сам (не требуется repaint ())

Попробуйте получить обзор, так как это новый способ разработки приложений:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...