Я не думаю, что 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;
}
}
Надеюсь, это поможет.