Где объявлены неназванные элементы XAML? - PullRequest
0 голосов
/ 10 апреля 2020

Ниже показана часть моего MainWindow.xaml :

<Grid>
    <ListBox x:Name="listBox"                          (Line #40)
        ItemsSource="{Binding Rectangles}"
        SelectionMode="Extended" >
        <ListBox.ItemsPanel>
            <ItemsPanelTemplate>
                <Canvas />
            </ItemsPanelTemplate>
        </ListBox.ItemsPanel>
        <ListBox.ItemContainerStyle>
            <Style
                TargetType="{x:Type ListBoxItem}" >
                <Setter
                    Property="Canvas.Left"
                    Value="{Binding X}" />
                <Setter
                    Property="Canvas.Top"
                    Value="{Binding Y}" />
            </Style>
        </ListBox.ItemContainerStyle>
    </ListBox>
    <Canvas x:Name="dragSelectionCanvas"               (Line #64)
        Visibility="Collapsed" >
        <Border x:Name="dragSelectionBorder"           (Line #66)
            Opacity="0.5" />
    </Canvas>
</Grid>

И это соответствующий MainWindow.gics файл, сгенерированный Visual Studio:

public partial class MainWindow : System.Windows.Window, System.Windows.Markup.IComponentConnector {

    #line 40 "..\..\MainWindow.xaml"
    internal System.Windows.Controls.ListBox listBox;

    #line 64 "..\..\MainWindow.xaml"
    internal System.Windows.Controls.Canvas dragSelectionCanvas;

    #line 66 "..\..\MainWindow.xaml"
    internal System.Windows.Controls.Border dragSelectionBorder;

(для краткости я удалил несколько строк.)

В файле .cs я вижу, что для каждого элемента XAML с атрибутом x:Name Visual Studio создает соответствующий элемент объявление.

Мой вопрос: где находятся объявления для тех элементов XAML, таких как элемент Grid выше, а также внешнего элемента Window (не показан), который не имеет атрибута x:Name ? Они также объявлены за кадром?

1 Ответ

1 голос
/ 10 апреля 2020

Они нигде не объявлены.

Код XAML, подобный этому:

<Canvas x:Name="dragSelectionCanvas"               (Line #64)
    Visibility="Collapsed" >
    <Border x:Name="dragSelectionBorder"           (Line #66)
        Opacity="0.5" />
</Canvas>

равно

new Canvas
{
    Visibility = Visibility.Collapsed,
    Content = new Border { Opacity = 0.5 }
}

Вам нужна только ссылка на root элемент управления это в вашем классе xaml.cs. Вещи с именами являются просто краткими ссылками на этот объект, так что вам не нужно каждый раз go спускаться вниз по логическому дереву.

Как только вы поймете, что <SomeClass Property="5"/> == new SomeClass { Property = 5 } все становится проще.

Например, в MVVM вы устанавливаете свойство ViewModel. Вы можете сделать это в xaml.cs в конструкторе:

this.ViewModel = new SpecificViewModel() - если он имеет конструктор по умолчанию

или в xaml:

<MyControl.ViewModel> <SpecificViewModel/> </MyControl.ViewModel>

По сути, это означает, что вы можете создать полноценный UserControl только в файле cs, например так:

public class MyControl : UserControl
{
    public MyControl()
    {
       Content = new StackPanel { Content = new TextBlock{ Text = "Sample Text"}};
    }
}

Обратите внимание, что на TextBlock нигде нет ссылок, но он все еще там. Аналогичный xaml теперь должен быть прямым для написания.

Вы, вероятно, заметили отсутствие вызова InitializeComponents(). Это потому, что под капотом он запускает сгенерированный из XAML и заполняет this.Content и устанавливает ссылки на объекты с именами. Отсутствие XAML означает, что нет необходимости вызывать этот метод.

Более подробную информацию можно найти здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...