Создание вложенного свойства Window.Title - PullRequest
1 голос
/ 01 февраля 2010

У меня есть оконная оболочка, которая в основном:

<Window>
    <ContentPresenter Content="{Binding}" />
</Window>

В ContentPresenter во время выполнения вводятся пользовательские элементы управления. Я хочу написать:

<UserControl Window.Title="The title for my window">
[...]
</UserControl>

Чтобы заголовок окна обновлялся с использованием свойства UserControl Window.Title.

У меня такое чувство, что этого можно достичь с помощью прикрепленных свойств. Может ли кто-нибудь начать меня в правильном направлении?

Daniel

Ответы [ 2 ]

3 голосов
/ 01 февраля 2010

Я использовал следующее:

public static class WindowTitleBehavior
{
    public static readonly DependencyProperty WindowTitleProperty = DependencyProperty.RegisterAttached(
        "WindowTitleProperty", typeof(string), typeof(UserControl),
                 new FrameworkPropertyMetadata(null, WindowTitlePropertyChanged));

    public static string GetWindowTitle(DependencyObject element)
    {
        return (string)element.GetValue(WindowTitleProperty);
    }

    public static void SetWindowTitle(DependencyObject element, string value)
    {
        element.SetValue(WindowTitleProperty, value);
    }

    private static void WindowTitlePropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        UserControl control = d as UserControl;
        if (!control.IsLoaded)
        {
            control.Loaded += new RoutedEventHandler(setTitle);
        }
        setTitle(control);
    }

    private static void setTitle(object sender, RoutedEventArgs e)
    {
        UserControl control = sender as UserControl;
        setTitle(control);
        control.Loaded -= new RoutedEventHandler(setTitle);
    }

    private static void setTitle(UserControl c)
    {
        Window parent = UIHelper.FindAncestor<Window>(c);
        if (parent != null)
        {
            parent.Title = (string)WindowTitleBehavior.GetWindowTitle(c);
        }
    }
}

В котором используется фрагмент кода Филиппа Суми для поиска первого окна предка: http://www.hardcodet.net/2008/02/find-wpf-parent

На мой взгляд, теперь я могу сделать:

<UserControl Behaviors:WindowTitleBehavior.WindowTitle="My Window Title">

И устанавливает заголовок содержащего Окно.

3 голосов
/ 01 февраля 2010

C #:

public class MyUserControl : UserControl
{
   public static readonly DependencyProperty WindowTitleProperty = DependencyProperty.RegisterAttached("WindowTitleProperty",
                typeof(string), typeof(UserControl),
                new FrameworkPropertyMetadata(null, WindowTitlePropertyChanged));

        public static string GetWindowTitle(DependencyObject element)
        {
            return (string) element.GetValue(WindowTitleProperty);
        }

        public static void SetWindowTitle(DependencyObject element, string value)
        {
            element.SetValue(WindowTitleProperty, value);
        }

        private static void WindowTitlePropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
                    Application.Current.MainWindow.Title = e.NewValue;
        }
}

XAML:

<UserControl namespace:MyUserControl.WindowTitle="The title for my window">
[...]
</UserControl>
...