Я хочу 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.Я отправлю другой вопрос для этого.