Производный от IconElement или IconSourceElement в UWP
Я пытаюсь создать такой же настраиваемый элемент управления значком символа, что и MS SymbolIcon, который будет получать значения символов перечисления в качестве входных данных, а эквивалентное значение данных пути будет извлечено из коллекции Dictionary
'IconElement не принимает конструктор, который принимает 0 аргументов'
Унаследовать от IconElement в UWP
но я пометил свой конструктор как extern и заключил его в точку с запятой, чтобы решить проблему с конструктором.
public class CustomSymbolIcon : IconElement
{
public extern CustomSymbolIcon();
}
Но мой вопрос в том, что я могу получить ввод от конечного пользователя как Symbol Enum и получить эквивалентную геометрию пути на основе ввода из сохраненного словаря. Но я не мог привязать геометрию пути к элементу пути (класс целевых настраиваемых значков) и не могу написать стиль шаблона для этого класса. Потому что IconElement был производным от элемента framework.
Я могу достичь всего этого с помощью класса управления, но я не могу использовать это внутри тега
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>
- Как инициализировать словарь в конструкторе пользовательского класса? - Необходимо заполнить словарь при загрузке элемента управления. Я не могу вызвать этот метод в конструкторе extern.
- Если возможно, получение геометрии пути с использованием символа, полученного с помощью коллекции Dictionary
. Это эффективный способ?,Bcz это приводит к тому, что ключ уже добавлен в проблему коллекции при инициализации элемента управления во второй раз. Пожалуйста, предложите альтернативные способы достижения этого. - Как написать стиль для элемента каркаса? Мне нужно привязать данные Path в стиле управления. Но у него нет свойства шаблона.
Может ли кто-нибудь подсказать, как этого добиться?
1 ответ
Производный от IconElement или IconSourceElement в 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>