Как сделать это с именем ComboBox в XAML, чтобы перестать выдавать ошибку компилятора? - PullRequest
0 голосов
/ 30 мая 2019

Я пытаюсь создать масштабируемую панель инструментов, которая содержит, помимо других элементов, 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, имя которого уже зарегистрировано, когда оно было определено в другой области.

...