:: Не фоксом единым
C# WPF привязка (binding) 2
S-type

Сообщений: 2969
Дата регистрации: 24.04.2004
Задача тривиальная - сделать, что бы приложение запоминало ширину окна, а после открытия восстанавливала.

Добавляю в параметры проекта свойство Width типа Double.

Меняю MainWindow():

public MainWindow()
{
InitializeComponent();
Binding binding = new Binding();
binding.Source = Properties.Settings.Default;
binding.Path = new PropertyPath("Width");
binding.Mode = BindingMode.TwoWay;
this.SetBinding(WidthProperty, binding);
}

Добавляю для окна обработчик на закрытие:

private void MainWindow_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
Properties.Settings.Default.Save();
}

Ура, всё работает. Но, это с помощью кода. Пытаюсь сделать с помощью XAML - указываю для окна:

Width="{Binding ElementName=Properties.Settings.Default,Path=Width}"

Не работает

Как сделать привязку с помощью XAML?
Ratings: 0 negative/0 positive
Re: C# WPF привязка (binding) 2
S-type

Сообщений: 2969
Дата регистрации: 24.04.2004
В книжке Мэтью Мак-Дональда сказано:

Цитата:
Привязываясь к объекту, не являющемуся элементом вы должны отказаться от свойства Binding.ElementName ...

попробовал заменить на

Width="{Binding Source={x:Static Properties.Settings.Default},Path=Width}"

вижу сообщение об ошибке "Вложенные типы не поддерживаются: Properties.Settings".



Исправлено 1 раз(а). Последнее : S-type, 29.09.16 12:33
Ratings: 0 negative/0 positive
Re: C# WPF привязка (binding) 2
S-type

Сообщений: 2969
Дата регистрации: 24.04.2004
Добавил

xmlns:properties="clr-namespace:Test.Properties"

изменил привязку:

Width="{Binding Source={x:Static properties:Settings.Default},Path=Width,Mode=TwoWay}"

Ура, всё заработало. Вопрос закрыт.
Ratings: 0 negative/0 positive
Re: C# WPF привязка (binding) 2
Simple777

Сообщений: 33855
Дата регистрации: 05.11.2006
Редкое качество - самодостаточность!..
Ratings: 0 negative/0 positive
Re: C# WPF привязка (binding) 2
SoccerStudio
Автор

Сообщений: 5055
Откуда: Подмосковье
Дата регистрации: 28.11.2006
Сам с собой поговорил - сразу сам себя зауважал.


------------------
"Здесь я, братцы, сдержу матерщину, и скажу только "... мать!"" (с) Шаов
Ratings: 0 negative/0 positive
Re: C# WPF привязка (binding) 2
S-type

Сообщений: 2969
Дата регистрации: 24.04.2004
Бывает
Ratings: 0 negative/0 positive
Re: C# WPF привязка (binding) 2
S-type

Сообщений: 2969
Дата регистрации: 24.04.2004
Вы бы в соседнюю тему посмотрели forum.foxclub.ru - может какие мысли есть?
Ratings: 0 negative/0 positive
Re: C# WPF привязка (binding) 2
S-type

Сообщений: 2969
Дата регистрации: 24.04.2004
Итак, есть окно, которое помнит свои размеры и положение, а так же помнит установленный цвет фона или фоновую картинку.

<Window x:Class="TestColorPicker.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:properties="clr-namespace:TestColorPicker.Properties"
xmlns:local="clr-namespace:TestColorPicker"
mc:Ignorable="d"
Title="MainWindow"
Height="{Binding Source={x:Static properties:Settings.Default},Path=Height,Mode=TwoWay}"
Width="{Binding Source={x:Static properties:Settings.Default},Path=Width,Mode=TwoWay}"
Top="{Binding Source={x:Static properties:Settings.Default},Path=Top,Mode=TwoWay}"
Left="{Binding Source={x:Static properties:Settings.Default},Path=Left,Mode=TwoWay}"
Closing="MainWindow_Closing">
<Grid>
</Grid>
<Window.ContextMenu>
<ContextMenu x:Name="myContextMenu">
<MenuItem Header="Установить цвет фона"
Click="ColorDialog_Click"
Name="ItemColor"></MenuItem>
<MenuItem Header="Установить фоновый рисунок"
Click="ImageDialog_Click"
Name="ItemImage"></MenuItem>
</ContextMenu>
</Window.ContextMenu>
</Window>

public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
ItemImage.IsChecked = Properties.Settings.Default.IsImage;
ItemColor.IsChecked = !ItemImage.IsChecked;
if (Properties.Settings.Default.IsImage)
{
if (!String.IsNullOrEmpty(Properties.Settings.Default.Image))
{
Background = new ImageBrush(new BitmapImage(new Uri(BaseUriHelper.GetBaseUri(this), Properties.Settings.Default.Image)));
}
}
else
{
Background = new SolidColorBrush(Properties.Settings.Default.Color);
}
}
private void MainWindow_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
Properties.Settings.Default.IsImage = ItemImage.IsChecked;
Properties.Settings.Default.Save();
}
private void ColorDialog_Click(object sender, RoutedEventArgs e)
{
var dialog = new System.Windows.Forms.ColorDialog();
if (dialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
Background = new SolidColorBrush(Color.FromArgb(dialog.Color.A, dialog.Color.R, dialog.Color.G, dialog.Color.B));
Properties.Settings.Default.Color = Color.FromArgb(dialog.Color.A, dialog.Color.R, dialog.Color.G, dialog.Color.B);
ItemColor.IsChecked = true;
ItemImage.IsChecked = false;
}
}
private void ImageDialog_Click(object sender, RoutedEventArgs e)
{
OpenFileDialog openFileDialog1 = new OpenFileDialog();
openFileDialog1.Filter = "Картинки (*.img,*.gif,*.png)|*.img;*.gif;*.png|Все файлы (*.*)|*.*";
openFileDialog1.RestoreDirectory = true;
if (openFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
Properties.Settings.Default.Image = openFileDialog1.FileName;
Background = new ImageBrush(new BitmapImage(new Uri(BaseUriHelper.GetBaseUri(this), openFileDialog1.FileName)));
ItemColor.IsChecked = false;
ItemImage.IsChecked = true;
}
}
}

Для сохранения информации используются параметры:

[attachment 25961 s2.png]

Всё работает так, всё прекрасно.
Вопрос - можно что то из кода перенести в XAML? На сколько понимаю, можно сделать привязку ItemColor.IsChecked к Properties.Settings.Default.IsImage. А привязку Background к Properties.Settings.Default.Image или Properties.Settings.Default.Color можно как то сделать? Ведь она будет в зависимости от значения Properties.Settings.Default.IsImage?



Исправлено 1 раз(а). Последнее : S-type, 30.09.16 12:25
Ratings: 0 negative/0 positive
Re: C# WPF привязка (binding) 2
SoccerStudio
Автор

Сообщений: 5055
Откуда: Подмосковье
Дата регистрации: 28.11.2006
S-type
Вопрос - можно что то из кода перенести в XAML?
Привязать можно практически все, за очень редкими исключениями.
Лично я бы повыкинул на фиг все обработчики событий, прописанные в XAML. Не, так делать, конечно, можно, но это не есть айс, потому что теряется одна из основополагающих прелестей WPF - независимость внешнего вида от кода.
Почитай про MVVM, думаю, сообразишь, что я имею ввиду. В основном разработчики WPF используют именно этот паттерн, хотя у него есть и свои недостатки, как правило, жалуются на тормоза при чересчур больших количествах привязок. Тем не менее...
Лично мне нравилось использовать усеченный вариант - VVM. Т.е. на каждый экран делал свой view model и отдельно (иногда даже в другой сборке) view в Xaml. Причем использовать code-behind во view тоже практически не приходилось. Что же касается элемента M (model), то в качестве такового использовал всякие разные видные в данном контексте вещи (т.е. все классы и свойства, доступные для view model), не выделяя их в отдельные элементы.


------------------
"Здесь я, братцы, сдержу матерщину, и скажу только "... мать!"" (с) Шаов
Ratings: 0 negative/0 positive
Re: C# WPF привязка (binding) 2
S-type

Сообщений: 2969
Дата регистрации: 24.04.2004
SoccerStudio
Лично я бы повыкинул на фиг все обработчики событий, прописанные в XAML.

<Window x:Class="TestColorPicker.MainWindow"
[...]
Closing="MainWindow_Closing">

Как можно выкинуть обработчик события MainWindow_Closing?
Ratings: 0 negative/0 positive
Re: C# WPF привязка (binding) 2
SoccerStudio
Автор

Сообщений: 5055
Откуда: Подмосковье
Дата регистрации: 28.11.2006
Ну, в данном случае идет просто определение окна - железное и неизменяемое определение. Забили, скомпилировали - ок.
Попробуй написать приложение, у которого внешний вид окна кардинально меняется в зависимости от чего-либо. Тогда придешь к необходимости использовать стили и шаблоны, определяющие его внешний вид, и если функционал закрытия окна ты засунешь в шаблон, то приложение при закрытии окна всякий раз будет делать то, что прописано в его шаблоне. А что оно конкретно будет делать - это только дизайнер шаблона знает, может, матерный MessageBox выводить, а может и диск C форматировать.


------------------
"Здесь я, братцы, сдержу матерщину, и скажу только "... мать!"" (с) Шаов
Ratings: 0 negative/0 positive
Re: C# WPF привязка (binding) 2
S-type

Сообщений: 2969
Дата регистрации: 24.04.2004
Т.е. в данном случае обработчики всё таки лучше оставить?
Ratings: 0 negative/0 positive
Re: C# WPF привязка (binding) 2
SoccerStudio
Автор

Сообщений: 5055
Откуда: Подмосковье
Дата регистрации: 28.11.2006
А это тебе решать, что для тебя лучше. Если нужно просто WPF-приложение "как на WinForms", или это просто некая "тренировка", то можно оставить. А если хочешь, чтобы внешний вид менялся, то там уже придется использовать шаблоны и стили. И тогда уже сам увидишь, что не стоит.


------------------
"Здесь я, братцы, сдержу матерщину, и скажу только "... мать!"" (с) Шаов
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 8 (Гостей: 8)

© 2000-2024 Fox Club 
Яндекс.Метрика