2010-02-01 3 views
1

У меня есть раковина окно, в основном:Создание Window.Title Attached Property

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

Введенный в ContentPresenter время выполнения являются элементы управления UserControl. То, что я хочу быть в состоянии сделать это написать:

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

Так что заголовок окна обновляется с помощью свойства UserControlWindow.Title.

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

Daniel

+0

Я не думаю, что вы можете сделать 'Window.Title', т. Е. Создать прикрепленное свойство для уже существующего класса. Что вы можете сделать, так это создать свойство MyCustomControl.WindowTitle, которое устанавливает заголовок окна (и может быть прикреплено к произвольному элементу управления). – Heinzi

ответ

3

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> 
+0

Это почти правильно, за исключением того, что вам не нужно наследовать от UserControl. Просто измените 'public class MyUserControl: UserControl' на' public class MyUserControlBehaviour'. Бонусные баллы за показ правильного XAML –

+0

Я не думаю, что вы всегда хотите изменить название «главного окна» ... – Heinzi

+0

Heinzi прав, я хочу изменить элемент Title of Window, в котором находится пользовательский элемент управления , Например, при создании диалогов. – djskinner

3

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

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); 
     } 
    } 
} 

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

В моих взглядах я могу теперь сделать:

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

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

+1

Как изменить приведенный выше код, чтобы разрешить мне делать: В настоящее время я получаю компиляцию. – djskinner

+0

Daniel, Могли ли вы связать свойство Title Window ...? –

+0

Это было слишком долго, чтобы помнить, но оглядываться на коде, который я это: Поведение: WindowTitleBehavior.WindowTitle = «{х: Static р: Resources.NewClassWindowTitle}» Так что я предполагаю, что я никогда не связывание работать правильно – djskinner