Расширение кнопки управления в Авалонии - PullRequest
0 голосов
/ 10 октября 2018

Я хочу AdditionalTextButton, который, очевидно, имеет дополнительное текстовое свойство.Моя первая попытка - расширить Avalonia.Controls.Button.Это правильный путь?

using Avalonia;
using Avalonia.Controls;
using Avalonia.Media;
using System;

namespace VW7OrbMachineAvalonia1.Components.Controls
{

    public class AdditionalTextButton : Button
    {

        /// <summary>
        /// Bottom left displayed Text
        /// </summary>
        public string BottomLeftText
        {
            get { return (string)GetValue(BottomLeftTextProperty); }
            set { SetValue(BottomLeftTextProperty, value); }
        }

        public static readonly StyledProperty<String> BottomLeftTextProperty =
            AvaloniaProperty.Register<AdditionalTextButton, String>("BottomLeftText");
    }
}

Тогда я хочу использовать AdditionalTextButton:

  <vwaui:AdditionalTextButton
          Width="100"
          Height="100"
          Content="Content"
          BottomLeftText="BottomLeft">
  </vwaui:AdditionalTextButton>

Но AdditionalTextButton не отображается.

После этого, если онбудет работать, я хочу применить стиль к AdditionalTextButton

<Styles xmlns="https://github.com/avaloniaui"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
        xmlns:vwaui="clr-namespace:VW7OrbMachineAvalonia1.Components.Controls;assembly=VW7OrbMachineAvalonia1">

  <Style x:Key="additionalTextButtonStyle" Selector="is vwaui:Additionaltextbutton">
    <Setter Property="Button.FontSize" Value="22"/>
    <Setter Property="Button.Template">
      <Setter.Value>
        <ControlTemplate>
          <Grid Width="{TemplateBinding Width}" Height="{TemplateBinding Height}">
                <TextBlock HorizontalAlignment="Left" VerticalAlignment="Bottom"  TextWrapping="Wrap" Text="{TemplateBinding BottomLeftText}"/>
                <TextBlock HorizontalAlignment="Center" VerticalAlignment="Center"  TextWrapping="Wrap" Text="{TemplateBinding Content}"/>
          </Grid>
        </ControlTemplate>
      </Setter.Value>
    </Setter>
  </Style>
</Styles>

Но с этим стилем я получил следующее исключение:

Portable.Xaml.XamlObjectWriterException: Set value of member '{clr-namespace:Avalonia.Controls;assembly=Avalonia.Controls}ContentControl.Content' threw an exception ---> System.ArgumentException: Property 'Template not registered on 'Avalonia.Controls.Grid
   at Avalonia.AvaloniaObject.ThrowNotRegistered(AvaloniaProperty p)
   at Avalonia.AvaloniaObject.Bind(AvaloniaProperty property, IObservable`1 source, BindingPriority priority)
   at Avalonia.Styling.Style.Attach(IStyleable control, IStyleHost container)
   at Avalonia.Styling.Styles.Attach(IStyleable control, IStyleHost container)
   at Avalonia.Styling.Styles.Attach(IStyleable control, IStyleHost container)
   at Avalonia.Styling.Styler.ApplyStyles(IStyleable control, IStyleHost styleHost)
   at Avalonia.Styling.Styler.ApplyStyles(IStyleable control, IStyleHost styleHost)
   at Avalonia.Controls.Control.OnAttachedToLogicalTreeCore(LogicalTreeAttachmentEventArgs e)
   at Avalonia.Controls.Control.Avalonia.Controls.ISetLogicalParent.SetParent(ILogical parent)
   at Avalonia.Controls.Control.SetLogicalParent(IEnumerable`1 children)
   at Avalonia.Collections.AvaloniaList`1.NotifyAdd(IList t, Int32 index)
   at System.Reactive.Observer`1.OnNext(T value)
   at Avalonia.AvaloniaObject.RaisePropertyChanged(AvaloniaProperty property, Object oldValue, Object newValue, BindingPriority priority)
   at Avalonia.AvaloniaObject.Avalonia.IPriorityValueOwner.Changed(PriorityValue sender, Object oldValue, Object newValue)
   at Avalonia.Utilities.DeferredSetter`2.<>c__DisplayClass9_0`1.<SetAndNotify>b__0(Action notification)
   at Avalonia.PriorityValue.UpdateCore(ValueTuple`2 update, ValueTuple`2& backing, Action`1 notify)
   at Avalonia.Utilities.DeferredSetter`2.SetAndNotify[TValue](TProperty property, TValue& backing, SetterDelegate`1 setterCallback, TSetRecord value)
   at Avalonia.PriorityValue.UpdateValue(Object value, Int32 priority)
   at Avalonia.AvaloniaObject.SetStyledValue(AvaloniaProperty property, Object value, BindingPriority priority)
   at Portable.Xaml.XamlObjectWriterInternal.SetValue(XamlMember member, Object target, Object value)
   --- End of inner exception stack trace ---
   at Portable.Xaml.XamlObjectWriterInternal.SetValue(XamlMember member, Object target, Object value)
   at Portable.Xaml.XamlWriterInternalBase.WriteEndMember()
   at Portable.Xaml.XamlServices.Transform(XamlReader xamlReader, XamlWriter xamlWriter, Boolean closeWriter)
   at Avalonia.Markup.Xaml.AvaloniaXamlLoaderPortableXaml.LoadFromReader(XamlReader reader, AvaloniaXamlContext context)
   at Avalonia.Markup.Xaml.AvaloniaXamlLoaderPortableXaml.Load(Stream stream, Object rootInstance, Uri uri)
   at Avalonia.DesignerSupport.DesignWindowLoader.LoadDesignerWindow(String xaml, String assemblyPath)
   at Avalonia.DesignerSupport.Remote.RemoteDesignerEntryPoint.<>c__DisplayClass17_0.<OnTransportMessage>b__0()

В общем, я заинтересован в расширении элементов управленияКакой способ сделать это в Авалонии?Я не получаю это с Документация или Источник .Я надеюсь, что вы можете объяснить это мне и указать правильное направление.

[Редактировать] Хорошо, я добавил эту строку в AdditionalTextButton.cs:

Type IStyleable.StyleKey => typeof(Button);

Теперь AdditionalTextButton виден, но стилизован по-другому по сравнению с другими кнопками в макете.И дополнительный TextButtonStyle также не применяется к дополнительному текстовому кнопку.Если я изменю «Button» в строке выше на «AdditionalTextButton», AdditionalTextButton больше не будет виден.После этого я присвоил styleClass для AdditionalTextButton и стиль для принудительного применения стиля, но тогда все кнопки больше не видны.Я не понимаю этого поведения.

[Edit 2] Если для StyleKey задано typeOf (AdditionalTextButton), AdditionaltextbuttonStyle применяется корректно.Но теперь другой стиль, который должен применяться ко всем кнопкам, не применяется к кнопке AdditionalTextButton.Я отправлю другой вопрос для этого.

...