Стилизация заголовка ChildWindow - PullRequest
1 голос
/ 09 декабря 2011

Я новичок в 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 голосов
/ 09 декабря 2011

Что вы действительно хотите сделать, так это использовать шаблон 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 для модели представления при создании дочернего окна, например:

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

и подключите заголовок дочерних окон до ViewModel в Xaml следующим образом:

<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 обновить себя с новым установленным значением. Это может показаться ОЧЕНЬ многословным способом ведения дел, но если вы подумаете о том, что это позволяет делать в течение нескольких минут, вы увидите огромные преимущества. Привязка выходит далеко за рамки простых текстов заголовков ...

Надеюсь, что все будет работать как есть, но я делаю это по памяти, так что извините за любые ошибки ...

...