Как сделать событие для элемента шаблона? - PullRequest
1 голос
/ 24 октября 2011

У меня есть шанс в WPF сделать событие для элемента управления в шаблоне, не создавая UserControl или так далее?Например: созданный шаблон окна имеет пользовательскую кнопку «Закрыть (X)».Он имеет одинаковую операцию для всех окон.Есть ли шанс заставить его работать?Событие Give Click, которое закроет окно?

Я имею в виду использовать его так:

<Window style="{StaticResource MyWindowTemplate}">...</Window>

И не создает пользовательский класс Window, потому что я хочу иметь возможность использовать его для каждогоклассы Windows.

Так есть ли шанс сделать это так?Или любое подобное или лучшее решение?

1 Ответ

2 голосов
/ 24 октября 2011

Я не думаю, что Template может добиться поведения. Они для внешнего вида, но не для поведения. Для поведений мы прикрепили свойства и поведения, которые при присоединении к их действительным целевым объектам зависимостей ведут себя одинаково.

например. в вашем случае кнопка закрытия в верхнем правом углу является сложной, но любая кнопка в окне закрывает целевой пользовательский интерфейс, то есть само окно, если указано какое-то прикрепленное поведение.

 <Window x:Class="..."
         ...>
    <Grid>
        <Grid.RowDefinitions>
           <RowDefinition Height="*"/>
           <RowDefinition Height="Auto"/>
        </Grid.RowDefinitions>
        <ContentControl ... />
        <Buton Width="100"
               Content="Close"
               local:CloseBehavior.IsCloseButton="True" />
   </Grid>
 </Window>

Таким образом, в приведенном выше примере любая кнопка, для которой настроено прикрепленное поведение local:CloseBehavior.IsCloseButton="True", нажимает эту кнопку, чтобы закрыть окно своего предка.

EDIT:

CloseBehavior.IsCloseButton это что-то вроде приведенного ниже. Таким образом, в приведенном ниже коде, когда мы устанавливаем IsCloseButton присоединенное свойство как true для любой кнопки в любом окне, используя визуальный и логический обход, присоединенное поведение ищет окно предка и затем закрывает его при нажатии.

public static class CloseBehavior
{
    public static readonly DependencyProperty IsCloseButtonProperty
        = DependencyProperty.RegisterAttached(
            "IsCloseButton",
            typeof (bool),
            typeof (CloseBehavior),
            new PropertyMetadata(
               false,
               OnIsCloseButtonPropertyChanged));

    private static void OnIsCloseButtonPropertyChanged
        (DependencyObject depObj,
         DependencyPropertyChangedEventArgs e)
    {
        var buttonBase = depObj as ButtonBase;
        if (buttonBase != null && (bool)e.NewValue)
        {
            buttonBase.Click
                += (o, args) =>
                    {
                        var window
                            = GetVisualLogicalParent(
                                  buttonBase,
                                  typeof(Window)) as Window;

                        if (window != null)
                        {
                            window.Close();
                        }
                    };
        }
    }

    public static bool GetIsCloseButton(DependencyObject depObj)
    {
        return (bool)depObj.GetValue(IsCloseButtonProperty);
    }

    public static void SetIsCloseButton(
        DependencyObject depObj,
        bool value)
    {
        depObj.SetValue(IsCloseButtonProperty, value);
    }

    public static DependencyObject GetVisualLogicalParent(
       DependencyObject depObj,
       Type type)
    {
        if (depObj != null)
        {
            var parent = VisualTreeHelper.GetParent(depObj);
            if (parent == null)
            {
                parent = LogicalTreeHelper.GetParent(depObj);
            }
            if (parent != null)
            {
                if (type.IsInstanceOfType(parent))
                {
                    return parent;
                }
                else
                {
                    return GetVisualLogicalParent(parent, type);
                }
            }
        }

        return null;
    }
}

Надеюсь, это поможет.

...