Я пытаюсь создать масштабируемую панель инструментов, которая содержит, помимо других элементов, ComboBox.
В качестве содержимого экземпляра класса пользовательского элемента управления local:ZoomableStackPanel
, который наследуется от StackPanel, у меня есть имя ComboBox.и добавляет свойство ZoomFactor, указанное в интерфейсе IZoomableControl.Произошла ошибка компилятора.
Кажется, ошибка вызвана реализацией пользовательского элемента управления, но я не знаю, чего не хватает.Если я заменю local:ZoomableStackPanel
на обычную StackPanel, ошибки не будет.Я также пытался без каких-либо IsSelected
ComboBoxItem-s, и ошибка остается.
MainWindow.xaml
<Window x:Class="cs_wpf_test_14.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:cs_wpf_test_14"
mc:Ignorable="d" Height="60" Width="200">
<local:ZoomableStackPanel Orientation="Horizontal">
<ComboBox Name="MyComboBox">
<ComboBoxItem IsSelected="True">abc</ComboBoxItem>
<ComboBoxItem>def</ComboBoxItem>
<ComboBoxItem>ghi</ComboBoxItem>
</ComboBox>
</local:ZoomableStackPanel>
</Window>
ZoomableStackPanel
XAML
<StackPanel x:Class="cs_wpf_test_14.ZoomableStackPanel"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:cs_wpf_test_14"
mc:Ignorable="d"
d:DesignHeight="450" d:DesignWidth="800">
<StackPanel.LayoutTransform>
<ScaleTransform
ScaleX="{Binding
RelativeSource={RelativeSource Mode=FindAncestor,
AncestorType=StackPanel},Path=ZoomFactor}"
ScaleY="{Binding
RelativeSource={RelativeSource Mode=FindAncestor,
AncestorType=StackPanel},Path=ZoomFactor}">
</ScaleTransform>
</StackPanel.LayoutTransform>
</StackPanel>
Code-behind
/// <summary>
/// Interaction logic for ZoomableStackPanel.xaml
/// </summary>
public partial class ZoomableStackPanel : StackPanel, IZoomableControl
{
public ZoomableStackPanel()
{
InitializeComponent();
}
public static readonly DependencyProperty ZoomFactorProperty =
DependencyProperty.Register("ZoomFactor", typeof(decimal), typeof(ZoomableStackPanel),
new FrameworkPropertyMetadata(1M));
public decimal ZoomFactor
{
get
{
return (decimal)GetValue(ZoomFactorProperty);
}
set
{
SetValue(ZoomFactorProperty, value);
}
}
}
Интерфейс
public interface IZoomableControl
{
decimal ZoomFactor { get; set; }
}
Я ожидал, что тестовый проект будет успешно построен, но есть ошибка компилятора:
Не удаетсяустановить значение атрибута Name 'MyComboBox' для элемента 'ComboBox'.ComboBox находится в области действия элемента ZoomableStackPanel, имя которого уже зарегистрировано, когда оно было определено в другой области.