:: Не фоксом единым
WPF ColorPicker
S-type

Сообщений: 2969
Дата регистрации: 24.04.2004
Потихоньку осваиваю WPF. Обнаружил, что в WPF отсутствует ColorDialog. Народ советует использовать ColorPicker из Extended WPF Toolkit wpftoolkit.codeplex.com (можно поставить через NuGet). Создал проект WPF, добавил Extended WPF Toolkit, добавил

xmlns:xceed="http://schemas.xceed.com/wpf/xaml/toolkit"

и

<Window.ContextMenu>
<ContextMenu x:Name="myContextMenu">
<WrapPanel>
<Label Content="Указать цвет"></Label>
<xceed:ColorPicker Name="ColorPicker1" DisplayColorAndName="False" Height="30" Width="200"
SelectedColor="Gray" SelectedColorChanged="ColorPicker_Click"/>
</WrapPanel>
<MenuItem Header="Установить фоновый рисунок"></MenuItem>
</ContextMenu>
</Window.ContextMenu>

Запускаю окно, щёлкаю правой кнопкой мыши, вижу:

[attachment 25951 s1.png]

и радуюсь увиденному. Затем добавляю обработчик события:

private void ColorPicker_Click(object sender, RoutedPropertyChangedEventArgs<Color?> e)
{
if (ColorPicker1.SelectedColor != null)
{
Background = new SolidColorBrush((Color)ColorPicker1.SelectedColor);
}
}

Теперь можно изменить цвет окна. Однако, жутко не нравится два момента.
Во первых, что бы изменить цвет окна после появления меню надо щёлкнуть мышью непосредственно по ColorPicker1. Так, если щёлкнуть по label ("Указать цвет") меню просто закроется. Как можно перехватить click с WrapPanel и перенаправить его на ColorPicker1? У WrapPanel ведь нет события Click. Может, надо использовать не WrapPanel, а что то другое?
Во вторых, после выбора цвета меню продолжает висеть на экране, и что бы его закрыть надо щёлкнуть куда то в окно. Как можно закрыть myContextMenu? У ContextMenu ведь нет свойства Close().



Исправлено 1 раз(а). Последнее : S-type, 28.09.16 23:33
Ratings: 0 negative/0 positive
Re: WPF ColorPicker
S-type

Сообщений: 2969
Дата регистрации: 24.04.2004
Изменил ColorPicker_Click - теперь после смены цвета контекстное меню закрывается. Второй вопрос закрыт.

private void ColorPicker_Click(object sender, RoutedPropertyChangedEventArgs<Color?> e)
{
if (ColorPicker1.SelectedColor != null)
{
Background = new SolidColorBrush((Color)ColorPicker1.SelectedColor);
}
myContextMenu.IsOpen = false;
}
Ratings: 0 negative/0 positive
Re: WPF ColorPicker
SoccerStudio
Автор

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


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

Сообщений: 2969
Дата регистрации: 24.04.2004
Второй вопрос не закрыт... Есть два состояния Standart и Advansed. Для Standart работает нормально, а для Advansed - глючит. Пришлось убрать "myContextMenu.IsOpen = false;".




Нельзя ли в WPF использовать ColorDialog из WindowsForms?

А ещё - можно как то русифицировать ColorPicker? Или, только брать исходники, переводить и компилить свою библиотеку?
Ratings: 0 negative/0 positive
Re: WPF ColorPicker
SoccerStudio
Автор

Сообщений: 5055
Откуда: Подмосковье
Дата регистрации: 28.11.2006
S-type
Нельзя ли в WPF использовать ColorDialog из WindowsForms?
Можно, почему нет. Даже рекомендуется.

S-type
А ещё - можно как то русифицировать ColorPicker? Или, только брать исходники, переводить и компилить свою библиотеку?
Вообще-то сделать свой ColorPicker было бы гораздо быстрее, чем пытаться переиначить какой-то сторонний эдемент, тем более варианты внешнего вида этого элемента могут быть ограничены разве что пределами собственной фантазии. У того же Макдональда достаточно подробно рассказывается, как делать свои элементы, причем именно на примере ColorPicker-а. Ну и на Code-Project наверняка пару-тройку примеров подобного найдешь.


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




Исправлено 2 раз(а). Последнее : SoccerStudio, 30.09.16 06:56
Ratings: 0 negative/0 positive
Re: WPF ColorPicker
S-type

Сообщений: 2969
Дата регистрации: 24.04.2004
SoccerStudio
Можно, почему нет. Даже рекомендуется.

Почему то был уверен, что использовать в WPF элементы из WinForms это плохая идея... Пошёл изучать этот вопрос.
Ratings: 0 negative/0 positive
Re: WPF ColorPicker
S-type

Сообщений: 2969
Дата регистрации: 24.04.2004
Добавил в ссылки Sustem.Windows.Forms, на форму добавил:

<MenuItem Header="Указать цвет" Click="ColorDialog_Click"></MenuItem>

в код добавил:

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

Потратил 15 минут и всё работает!




Спасибо за помощь.
Ratings: 0 negative/0 positive
Re: WPF ColorPicker
SoccerStudio
Автор

Сообщений: 5055
Откуда: Подмосковье
Дата регистрации: 28.11.2006
S-type
SoccerStudio
Можно, почему нет. Даже рекомендуется.

Почему то был уверен, что использовать в WPF элементы из WinForms это плохая идея... Пошёл изучать этот вопрос.
Элементы - да, там для них специальный контейнер требуется. А диалоги, тем более если для них нет аналогов - совсем дело другое.


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


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

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

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