Как мне установить элементы XAML из кода C #?

#c# #wpf #xaml

#c# #wpf #xaml

Вопрос:

Итак, у меня есть приложение wpf, и мой xaml выглядит так:

 <Window x:Class="MyTest"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:my="clr-namespace:MyTest.Layouts"
        xmlns:pl="clr-namespace:Planerator"
        Title="CardView" Topmost="False" AllowsTransparency="True" WindowStyle="None" WindowState="Maximized" ShowInTaskbar="False">
    <Grid>
        <pl:Planerator x:FieldModifier="public" x:Name="FrontProjection" Margin="240" >
            <my:FrontLayout />
        </pl:Planerator>

        <pl:Planerator x:FieldModifier="public" x:Name="BackProjection" Margin="240" >
            <my:BackLayout />
        </pl:Planerator>
    </Grid>
    <Window.Background>
        <SolidColorBrush />
    </Window.Background>
</Window>
  

Есть ли способ установить <my:FrontLayout /> и <my:FrontLayout /> для планировщиков внутри моего кода на C #?

РЕДАКТИРОВАТЬ: Planerator: http://blogs.msdn.com/b/greg_schechter/archive/2007/10/26/enter-the-planerator-dead-simple-3d-in-wpf-with-a-stupid-name.aspx

А FrontLayot и BackLayout -ы — это просто простые макеты xaml.

ПРАВКА2: причина, по которой мне нужно устанавливать их из кода, заключается в том, что я хочу использовать условную компиляцию. потому что, например, для ОТЛАДКИ это должно быть <my:DebugFrontLayer /> .

Комментарии:

1. Пожалуйста, измените свой заголовок на что-то более описательное по вопросу.

2. Можете ли вы опубликовать свои определения классов для pl: Planerator, my:FrontLayout и my:BackLayout?

Ответ №1:

Взглянув на класс Planerator, вы увидите, что он имеет ContentPropertyAttribute набор:

 [ContentProperty("Child")]
public class Planerator : FrameworkElement
{
}
  

Это означает, что

   <pl:Planerator x:FieldModifier="public" x:Name="FrontProjection" Margin="240" >
    <my:FrontLayout />
  </pl:Planerator> 
  

На самом деле это:

   <pl:Planerator x:FieldModifier="public" x:Name="FrontProjection" Margin="240" >
    <pl:Planerator.Child>
      <my:FrontLayout />
    </pl:Planerator.Child>
  </pl:Planerator>
  

Это также означает, что из кода, например, в конструкторе MyTest или где-либо еще, вы могли бы сделать следующее, чтобы добиться того же:

     public MyTest()
    {
        InitializeComponent();            
        FrontProjection.Child = new FrontLayout();
    }
  

Ответ №2:

Дайте им имена, например

 <my:FrontLayout Name="FrontLayout1" />
  

и тогда они должны быть доступны из C # как переменные с таким именем.