设置ChildWindow的标题

时间:2011-12-08 22:24:17

标签: wpf title childwindow

我是C#和wpf的新手。我有一个ChildWindow,其标题是从课外设置的。如果标题太长,我需要在末尾用省略号缩短标题。我完成了这项工作(代码缩短了):

<Namespace:ChildWindow
         x:Class="Namespace.MyClass">
     <Namespace:ChildWindow.Title>
         <TextBlock x:Name="_titleBlock" Width="300" TextTrimming="WordEllipsis"/>
     </Namespace:ChildWindow.Title>
</Namespace:Childwindow>

但是,我希望这个类的调用者能够设置ChildWindow.Title = "Something long"而不是ChildWindow._titleBlock = "Something long",因为我觉得它更有意义。是否有可能以某种方式通过事件来做到这一点?

1 个答案:

答案 0 :(得分:0)

您真正想要做的是使用MVVM模式将您的逻辑从视图中分离出来。这样你就可以将ViewModel传递给操纵子窗口的东西,而不是子窗口本身。

例如,子窗口的基本ViewModel可以是:

public class ChildWindowViewModel: INotifyPropertyChanged {
    private string _title;

    public string Title{
        get { return _title; }
        set{if (value != _title){
            _title = value;
            OnPropertyChanged("Title");
        }}
    }

    private void OnPropertyChanged(string propertyName){
        var handle = PropertyChanged;
        if (handle != null){
            handle(this, new PropertyChangedEventArgs(propertyName));
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
}

然后在创建子窗口时将DataContext设置为viewmodel:

//Creating the child window
ChildWindow child = new ChildWindow();
ChildWindowViewModel childViewModel = new ChildWindowViewModel();
child.DataContext = childViewModel;
//do stuff with child...

并将子窗口标题挂钩到Xaml中的ViewModel,如下所示:

<Namespace:ChildWindow
         x:Class="Namespace.MyClass">
     <Namespace:ChildWindow.Title>
         <TextBlock Width="300" TextTrimming="WordEllipsis" Text="{Binding Path=Title}/>
     </Namespace:ChildWindow.Title>
</Namespace:Childwindow>

然后,当您想要更改标题时,可以使用

childViewModel.Title = "A Very Long Title That Will Be Cut Short In Its Prime";

在ViewModel上设置标题将触发PropertyChanged事件,该事件将导致Xaml视图使用新设置的值更新自身。这可能看起来像是一种非常冗长的做事方式,但如果你想一想这可以让你做几分钟,你就会看到一些巨大的好处。这种约束超越了简单的标题文本......

希望这一切都能按原样运作,但我是从记忆中做到的,所以对任何错误感到抱歉...

相关问题