gpt4 book ai didi

c# - 从 UWP 中的 IconElement 或 IconSourceElement 派生

转载 作者:行者123 更新时间:2023-12-03 17:23:17 27 4
gpt4 key购买 nike

我正在尝试创建与 MS SymbolIcon 相同的自定义符号图标控件,它将获取枚举符号值作为输入,并且将从字典 集合中检索等效路径数据值。但是从 IconElement 继承的符号图标类和我的应用程序中面临的相同问题。
'IconElement 不采用带有 0 个参数的构造函数'
Derive from IconElement in UWP
但我已将我的构造函数标记为 extern 并用分号括起来以解决构造函数问题。

public class CustomSymbolIcon : IconElement
{
public extern CustomSymbolIcon();
}
但我的问题是,我可以从最终用户那里获取符号枚举的输入,并根据存储字典的输入检索等效路径几何。但是我无法将路径几何绑定(bind)到路径元素(目标自定义图标类),也无法为此类编写模板样式。因为 IconElement 是从框架元素派生的。
我可以使用 control class 来实现这些,但由于基类,我不能在 (它的 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>
  • 如何在自定义类的构造函数中初始化字典? - 加载控件时需要填充字典。我不能在外部构造函数中调用这个方法。
  • 如果可能,使用由 Dictionary 集合填充的符号实现的路径几何检索。这是有效的方法吗?,Bcz 导致在第二次初始化控件时已经在集合问题中添加了 key 。请提出替代方法来实现这一目标。
  • 如何为框架元素编写样式?我需要以控件样式绑定(bind)路径数据。但它没有模板属性。

  • 谁能建议如何实现这一目标?

    最佳答案

    Derive from IconElement or IconSourceElement in UWP


    恐怕你做不到 CustomSymbolIcon继承 IconElement , 和 IconElement不提供设置 ControlTemplate 的方法,对于您的场景,我们建议您使用自定义 Datatemplate替换 NavigationViewItem像下面这样
    <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>

    关于c# - 从 UWP 中的 IconElement 或 IconSourceElement 派生,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64541141/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com