Установщики свойств стиля WPF не работают для всех типов - PullRequest
1 голос
/ 10 марта 2011

Я читаю описание по Style с, Style.Trigger с и Property-Setters несколько раз, но я все еще, если стили применяются или нет, кажутся совершенно случайными.

В следующем примере Canvas станет белым, однако на Path это никак не повлияет:

<UserControl x:Class="Still.Tooll.CurveEditPoint"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:local="clr-namespace:Still.Tooll"
             >
    <UserControl.Style>
        <Style>
            <Style.Triggers>
                <Trigger Property="local:CurveEditPoint.IsSelected" Value="true">
                    <Setter Property="Path.Stroke" Value="#fff"/>
                    <Setter Property="Canvas.Background" Value="#fff"/>
                </Trigger>
            </Style.Triggers>
        </Style>
    </UserControl.Style>
    <Canvas>
        <Path StrokeThickness="0.5" Data="M 0, 0 L 40,20"/>  
    </Canvas>
</UserControl>

Я думаю, это как-то связано сВложение Path в Canvas, но опять же, должен быть способ стилизовать подэлементы элемента управления.

Я должен признать, что исходя из HTML / CSS, я нахожуСтайлинг WPF излишне сложен!Любые пункты или объяснения приветствуются!

спасибо, Том

Ответы [ 3 ]

2 голосов
/ 10 марта 2011

Вы не можете получить доступ к визуальным элементам UserControl таким образом.Стиль может устанавливать свойства только в UserControl.Таким образом, ваш первый установщик («Path.Stroke») будет искать свойство в вашем UserControl с именем Path, а затем устанавливать его Stroke.Он не применяется ко всем путям в вашем UserControl или к тому, который вы определили ниже.

Фон Canvas не устанавливается.Фон UserControl устанавливается, и холст по-прежнему не имеет фона.Причина, по которой сеттер работает с UserControl, заключается в том, что Canvas.BackgroundProperty и UserControl.BackgroundProperty являются одним и тем же свойством зависимости (даже если они разные владельцы).изменяются вашим стилем и связаны с вашими элементами.Примерно так (который использует свойства Background / Foreground):

<UserControl x:Name="userControl" x:Class="Still.Tooll.CurveEditPoint"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         xmlns:local="clr-namespace:Still.Tooll"
         >

    <UserControl.Style>
        <Style>
            <Style.Triggers>
                <Trigger Property="local:CurveEditPoint.IsSelected" Value="true">
                    <Setter Property="Foreground" Value="#fff"/>
                    <Setter Property="Background" Value="#fff"/>
                </Trigger>
            </Style.Triggers>
        </Style>
    </UserControl.Style>

    <Canvas>
        <Path Stroke="{Binding Element=userControl, Path=Foreground}" StrokeThickness="0.5" Data="M 0, 0 L 40,20"/>  
    </Canvas>
</UserControl>
0 голосов
/ 10 марта 2011

Хотя не через стиль, но вот обходной путь, который я использовал для достижения этой цели в своем приложении.

* Визуальный детский искатель *

    /// <summary>
    /// This function iterates through the visual tree and returns the child item of the type child item.
    /// </summary>
    /// <typeparam name="childItem"></typeparam>
    /// <param name="obj"></param>
    /// <returns></returns>
    public static TChild FindVisualChild<TChild>(DependencyObject obj)
        where TChild : DependencyObject
    {
        for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++)
        {
            DependencyObject child = VisualTreeHelper.GetChild(obj, i);

            if (child != null && child is TChild)
            {
                return (TChild)child;
            }
            else
            {
                TChild childOfChild = FindVisualChild<TChild>(child);

                if (childOfChild != null)
                {
                    return childOfChild;
                }
            }
        }

        return null;
    }

Используйте его в некотором коде позади, как - ListBox deviceImagesListBox = UtilityFunctions.FindVisualChild<RealisticListBox>(selectedRoomListBox);

Теперь у вас есть элемент управления, и вы можете поиграть с ним в Code Behind. Я согласен, что мы должны искать что-то для достижения этого, используя STYLE в XAML

0 голосов
/ 10 марта 2011

Если вы определите Style как Resource в UserControl, а затем примените его к каждому из элементов, которые могут работать:

<UserControl x:Class="Still.Tooll.CurveEditPoint"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         xmlns:local="clr-namespace:Still.Tooll"
         >

<UserControl.Resources>

    <Style x:Key="style">
        <Style.Triggers>
            <Trigger Property="local:CurveEditPoint.IsSelected" Value="true">
                <Setter Property="Path.Stroke" Value="#fff"/>
                <Setter Property="Canvas.Background" Value="#fff"/>
            </Trigger>
        </Style.Triggers>
    </Style>
</UserControl.Resources>

<Canvas Style="{StaticResource style}">
    <Path StrokeThickness="0.5"   Data="M 0, 0 L 40,20" Style="{StaticResource style}"/>
</Canvas>

...