【问题标题】:Derive from IconElement or IconSourceElement in UWP从 UWP 中的 IconElement 或 IconSourceElement 派生
【发布时间】:2021-02-08 22:43:47
【问题描述】:

我正在尝试创建与 MS SymbolIcon 相同的自定义符号图标控件,它将获取枚举符号值作为输入,并且将从字典 集合中检索等效路径数据值。但是从 IconElement 继承的符号图标类和我的应用程序中面临的相同问题。

'IconElement 不采用带 0 个参数的构造函数'

Derive from IconElement in UWP

但我已将构造函数标记为 extern 并用分号括起来以解决构造函数问题。

public class CustomSymbolIcon : IconElement
{ 
   public extern CustomSymbolIcon(); 
}

但我的问题是,我可以从最终用户获取输入作为符号枚举,并根据存储字典的输入检索等效路径几何。但我无法将路径几何绑定到路径元素(目标自定义图标类),也无法为此类编写模板样式。因为 IconElement 是从框架元素派生而来的。

我可以通过控制类来实现这些,但是由于基类,我不能在 (它的 IconElement 基础)标签中使用它。

public class SymbolToIconConversion : Control //IconElement instead of control
{
    internal static Dictionary<Symbol, string> enumValuesCollection = new Dictionary<Symbol, string>();

    public SymbolToIconConversion()
    {
        this.DefaultStyleKey = typeof(SymbolToIconConversion);
        PopulateEnumCollection();
    }

    public static Dictionary<Symbol, string> EnumValuesCollection
    {
        get { return enumValuesCollection; }
        set { enumValuesCollection = value; }
    }

    internal void PopulateEnumCollection()
    {
        enumValuesCollection.Add(Symbol.Accept, "M0,4 5,9 9,0 4,5");
        enumValuesCollection.Add(Symbol.Close, "F1 M 22,12L 26,12L 26,22L 36,22L 36,26L 26,26L 26,36L 22,36L 22,26L 12,26L 12,22L 22,22L 22,12 Z");
        enumValuesCollection.Add(Symbol.Save, "M0,4 5,9 9,0 4,5");
        enumValuesCollection.Add(Symbol.Add, "M0,5 H10 M5,5 V10Z");
    }

    public Symbol Symbol
    {
        get { return (Symbol)GetValue(SymbolProperty); }
        set { SetValue(SymbolProperty, value); }
    }

    // Using a DependencyProperty as the backing store for Symbol.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty SymbolProperty =
          DependencyProperty.Register("Symbol", typeof(Symbol), typeof(SfSymbolIcon), new PropertyMetadata(typeof(Symbol), new PropertyChangedCallback(OnSymbolChanged)));      

    internal Geometry Geometry
    {
        get { return (Geometry)GetValue(GeometryProperty); }
        set { SetValue(GeometryProperty, value); }
    }

    // Using a DependencyProperty as the backing store for Geometry.  This enables animation, styling, binding, etc...
    internal static readonly DependencyProperty GeometryProperty =
        DependencyProperty.Register("Geometry", typeof(Geometry), typeof(SymbolToIconConversion), new PropertyMetadata(null));

    private static void OnSymbolChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        SymbolToIconConversion symbolIcon = d as SymbolToIconConversion;
        if (symbolIcon != null)
        {
            foreach (var value in EnumValuesCollection)
            {
                if (symbolIcon.Symbol == value.Key)
                {
                    symbolIcon.Geometry = (Geometry)XamlBindingHelper.ConvertValue(typeof(Geometry), value.Value);
                    return;
                }
            }
        }
    }

 <Style TargetType="core:SymbolToIconConversion">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="core:SymbolToIconConversion">
                <Viewbox x:Name="ContentViewbox" AutomationProperties.AccessibilityView="Raw" HorizontalAlignment="Stretch" Height="{ThemeResource AppBarButtonContentHeight}" Margin="{ThemeResource AppBarButtonContentViewboxCollapsedMargin}">
                    <Path x:Name="Content" 
                          Width="{Binding Width, RelativeSource={RelativeSource Mode=TemplatedParent}}" 
                          Height="{Binding Height, RelativeSource={RelativeSource Mode=TemplatedParent}}" 
                          Fill="{Binding Foreground, RelativeSource={RelativeSource Mode=TemplatedParent}}" 
                          Data="{Binding Geometry, RelativeSource={RelativeSource Mode=TemplatedParent}}"/>
                </Viewbox>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>
  1. 如何在自定义类的构造函数中初始化字典? - 加载控件时需要填充字典。我无法在外部构造函数中调用此方法。
  2. 如果可能,使用由 Dictionary 集合实现的符号检索路径几何。这是有效的方法吗?,Bcz 在第二次初始化控件时,它会导致在集合问题中已经添加了密钥。请提出实现此目的的替代方法。
  3. 如何为框架元素编写样式?我需要以控件样式绑定路径数据。但它没有模板属性。

谁能建议如何做到这一点?

【问题讨论】:

  • 你对这个线程有任何更新吗?

标签: c# uwp uwp-xaml winui winui-3


【解决方案1】:

从 UWP 中的 IconElement 或 IconSourceElement 派生

恐怕你不能让继承IconElementCustomSymbolIcon,并且IconElement没有提供设置ControlTemplate的方法,对于你的场景,我们建议你使用自定义Datatemplate来替换@ 987654326@如下

<NavigationView.MenuItemTemplate>
    <DataTemplate>
        <Grid Width="{Binding ElementName=nvSample, Path=OpenPaneLength}" HorizontalAlignment="Stretch">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="auto" />
                <ColumnDefinition Width="*" />
            </Grid.ColumnDefinitions>
            <local:SymbolToIconConversion Symbol="Accept"  VerticalAlignment="Center"/>
            <StackPanel
                Grid.Column="1"
                Margin="45,0,10,0"
                HorizontalAlignment="Stretch"
                VerticalAlignment="Center">
                <TextBlock x:Name="Header" Text="Header" />
                <TextBlock x:Name="Line1" Text="TheFirstLine" />
            </StackPanel>
        </Grid>
    </DataTemplate>
</NavigationView.MenuItemTemplate>

【讨论】:

    猜你喜欢
    • 2016-05-03
    • 1970-01-01
    • 1970-01-01
    • 2020-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多