Как реализовать пользовательскую кисть в WPF?

Согласно вашему коду:

String[] name = {"tom", "dick", "harry"};
for(int i = 0; i<=name.length; i++) {
  System.out.print(name[i] +'\n');
}

Если вы проверите System.out.print (name.length),

, вы получите 3;

, что означает, что длина вашего имени равна 3

, ваш цикл работает от 0 до 3, который должен работать либо от «0 до 2», либо от «1 до 3»

Ответ

String[] name = {"tom", "dick", "harry"};
for(int i = 0; i<name.length; i++) {
  System.out.print(name[i] +'\n');
}
14
задан MojoFilter 27 April 2009 в 18:30
поделиться

3 ответа

Нельзя создать собственную кисть WPF, унаследовав ее от класса System.Windows.Media.Brush , поскольку этот класс содержит абстрактные внутренние элементы.

Если Вы используете Reflector для просмотра исходного кода класса System.Windows.Media.Brush , вы увидите следующие внутренние абстрактные методы:

internal abstract DUCE.ResourceHandle AddRefOnChannelCore(DUCE.Channel channel);
internal abstract DUCE.Channel GetChannelCore(int index);
internal abstract int GetChannelCountCore();
internal abstract DUCE.ResourceHandle GetHandleCore(DUCE.Channel channel);
internal abstract void ReleaseOnChannelCore(DUCE.Channel channel);

Они должны быть переопределены, но не могут быть внутренними.

Примечание: Отредактировал мой ответ, поскольку предыдущий ответ был о System.Drawing.Brush и не имеет отношения к этому вопросу. Особая благодарность Микко Рантанену за его комментарий.

3
ответ дан 1 December 2019 в 12:53
поделиться

Я быстро взглянул на существующие кисти, используя отражатель . Кажется, что их реализация довольно замкнута и зависит от большого количества внутренних сантехнических систем. Хотя может быть возможно реализовать собственную кисть, кажется, что она не поддерживается. Возможно даже, что элементы управления WPF тесно связаны с существующими кистями и не будут работать с пользовательскими.

Скорее всего, лучший способ добиться чего-то похожего на пользовательские кисти - это использовать DrawingBrush с некоторая сложная логика рисования. Вы можете составить кисть для рисования из сложных форм, используя другие кисти, так что это должно позволить вам достичь нужной цели.

Обновление после редактирования

Поскольку это для образования, вам лучше всего загрузить Reflector и использовать его, чтобы увидеть, как кисти работают. Они не предназначены для самореализации, и, поскольку они полагаются на некоторые внутренние классы , к которым программисты обычно не имеют доступа, это будет довольно сложно сделать.

Хотя интересно то, что в документации Brush есть примечание для наследников, которое поможет правильно наследовать Brush.

Другие обновления

При поиске я нашел довольно аккуратный способ добиться чего-то похожего на китайский блог . Хитрость в том, чтобы использовать расширение разметки, чтобы оно выглядело как кисть. На самом деле он создает новую кисть изображения на основе своих атрибутов. Кажется, он пришел к такому же выводу, что существуют некоторые внутренние классы, которые мешают легкой реализации.

Хотя то, что делает его интересным, заключается в том, что в документации Brush действительно есть примечание для наследников, которое поможет правильно унаследовать от Brush.

Другие обновления

При поиске я нашел довольно аккуратный способ добиться чего-то подобного в китайском блоге . Хитрость в том, чтобы использовать расширение разметки, чтобы оно выглядело как кисть. На самом деле он создает новую кисть изображения на основе своих атрибутов. Кажется, он пришел к такому же выводу, что существуют некоторые внутренние классы, которые мешают легкой реализации.

Хотя то, что делает его интересным, заключается в том, что в документации Brush действительно есть примечание для наследников, которое поможет правильно унаследовать от Brush.

Другие обновления

При поиске я нашел довольно аккуратный способ добиться чего-то подобного в китайском блоге . Хитрость в том, чтобы использовать расширение разметки, чтобы оно выглядело как кисть. На самом деле он создает новую кисть изображения на основе своих атрибутов. Кажется, он пришел к такому же выводу, что существуют некоторые внутренние классы, которые мешают легкой реализации.

Другие обновления

Когда я возился, я нашел довольно аккуратный способ добиться чего-то похожего в китайском блоге . Хитрость в том, чтобы использовать расширение разметки, чтобы оно выглядело как кисть. На самом деле он создает новую кисть изображения на основе своих атрибутов. Кажется, он пришел к такому же выводу, что существуют некоторые внутренние классы, которые мешают легкой реализации.

Другие обновления

Когда я возился, я нашел довольно аккуратный способ добиться чего-то похожего в китайском блоге . Хитрость в том, чтобы использовать расширение разметки, чтобы оно выглядело как кисть. На самом деле он создает новую кисть изображения на основе своих атрибутов. Кажется, он пришел к такому же выводу, что существуют некоторые внутренние классы, которые мешают легкой реализации.

10
ответ дан 1 December 2019 в 12:53
поделиться

Я перепробовал все возможные варианты решения проблемы создания пользовательской кисти, от использования MarkupExtensions до возни с атрибутами TypeConverter, но потом меня осенило: вы просто создаете класс-обертку на основе DependencyObject, создаете DependencyProperty типа Brush, реализуете свою настройку и привязываетесь к Brush DependencyProperty.

После этого поместите пользовательскую кисть в Resources

  <l:CustomBrush x:Key="CustomBrush" Brush="Magenta" />

Затем привяжитесь к ней:

  <Line X1="0" Y1="-5" X2="200" Y2="-5" 
        Stroke="{Binding Source={StaticResource CustomBrush}, Path=Brush}" 
        StrokeThickness="12"/>

Я думаю, это лучше, чем решение MarkupExtension, потому что вы не можете поместить кисть в Resources, и поэтому вам придется переопределять пользовательские настройки каждый раз, когда вы ее используете.

В любом случае, это кажется простым решением для наследования от любого объекта Wpf, а благодаря гибкости Bindings вы также можете привязываться к членам самого обернутого объекта Wpf.

Вот простой класс:

public class CustomBrush : DependencyObject
{
   public CustomBrush()
   {
      this.Brush = Brushes.Azure;      
   }

   #region Brush DependencyProperty

   [BindableAttribute(true)]
   public Brush Brush
   {
     get { return (Brush)GetValue(BrushProperty); }
     set { SetValue(BrushProperty, value); }
   }
   public static readonly DependencyProperty BrushProperty =
      DependencyProperty.Register(
         "Brush",
         typeof(Brush),
         typeof(CustomBrush),
         new UIPropertyMetadata(null));

   #endregion         
}
3
ответ дан 1 December 2019 в 12:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: