2010-02-01 2 views
1

부착 된 Window.Title 만들기. 내가 할 수 있기를 원하는 것은 쓰기입니다 :나는 기본적으로 창 쉘이 속성

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

창 제목이 UserControlWindow.Title 속성을 사용하여 업데이트됩니다 그래서.

첨부 된 속성을 사용하여이를 달성 할 수 있다고 생각합니다. 누구든지 올바른 방향으로 나를 시작할 수 있습니까?

다니엘

+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

"Main Window"의 제목을 항상 변경하고 싶지는 않다고 생각합니다 ... – Heinzi

+0

Heinzi가 맞습니다. 사용자 정의 컨트롤이있는 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); 
     } 
    } 
} 

첫 번째 찾기 조상 창 : 내보기에 http://www.hardcodet.net/2008/02/find-wpf-parent

내가 지금 할 수있는 :

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

그리고이 포함 된 윈도우의 제목을 설정합니다.

+1

위의 코드를 수정하여 어떻게 할 수 있습니까? 현재 컴파일 오류가 발생합니다. – djskinner

+0

Daniel, Window Title 속성을 바인딩 할 수 있었습니까? –

+0

은 기억하지만이이 코드를 다시 보는 데 시간이 너무 오래되었습니다 : 행동 : WindowTitleBehavior.WindowTitle = "{X : 정적 페이지 : Resources.NewClassWindowTitle}" 그래서 내가이 제대로 작동하려면 바인딩을 가진 적이 없어 추측 – djskinner

관련 문제