Какой способ WPF добавить поддержку этой функции в существующий редактор цвета? - PullRequest
1 голос
/ 02 января 2012

Я работаю с редактором свойств расширенного набора инструментов WPF, и мне нужно добавить поддержку редактирования System.Drawing.Color с помощью цветового редактора, который поставляется с этим набором инструментов.

Текущий редактор цветов выполняет свою работу через компонент «Выбор цвета» и, похоже, использует привязку данных для подключения свойства «Выбор цвета» SelectedColor непосредственно к свойству цвета редактируемого объекта. К сожалению, редакторы Инструментария реализованы путем возврата DependencyProperty для привязки, вместо того, чтобы просить связать его сами, поэтому не похоже, что я могу вставить (абсолютно тривиальное) преобразование типов туда.

Я вижу только два других способа сделать это:

  • продублируйте всю палитру цветов, изменив тип редактируемого свойства. Это последнее, что я хочу сделать по понятным причинам.
  • предоставляет второе свойство Color из палитры цветов типа System.Drawing.Color, так что мой новый редактор цветов может указать сетке свойств привязку к этому. Но мне сказали, что иметь два свойства зависимости с одинаковым базовым значением - ужасная идея.

Есть ли лучший способ?

Если мне действительно нужно предоставить два вида свойств Color в компоненте Color Picker, как правильно их синхронизировать?

1 Ответ

4 голосов
/ 02 января 2012

Вы можете привязать данные к System.Drawing.Color, используя преобразователь значений. Это работает в моей тестовой среде.

public class SystemDrawingColorConverter : IValueConverter
{
    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        System.Windows.Media.Color color = (System.Windows.Media.Color)value;
        return System.Drawing.Color.FromArgb(color.A, color.R, color.G, color.B);
    }

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        System.Drawing.Color color = (System.Drawing.Color)value;
        return System.Windows.Media.Color.FromArgb(color.A, color.R, color.G, color.B);
    }
}

XAML:

<Grid>
    <Grid.Resources>
        <local:SystemDrawingColorConverter x:Key="converter" />
    </Grid.Resources>
    <Grid.DataContext>
        <local:VM />
    </Grid.DataContext>
    <tk:ColorPicker SelectedColor="{Binding Color, Converter={StaticResource converter}}" />
</Grid>

код для модели тестового просмотра:

public class VM
{
    private System.Drawing.Color _color;

    public System.Drawing.Color Color
    {
        get { return _color; }
        set { _color = value; }
    }

}
...