Из того, что я читал, раньше был инструмент XamlIt, который должен был конвертировать такой XAML в C #, но больше не может найти его в Интернете

озадачен попыткой преобразовать следующий код в чистый c #. Этот код XAML взят из блога Cavanaghs о том, как сделать закругленные углы на чем угодно. Код работает, но мне нужно преобразовать его в c #, так как в некоторых случаях он должен быть динамическим. Если бы вы могли помочь, это было бы здорово.

<Setter Property="Template">
<Setter.Value>
    <ControlTemplate TargetType='{x:Type ListViewItem}'>
        <Grid>
            <Border CornerRadius="15" Name="mask" Background="White"/>
            <StackPanel Background="Beige">
                <StackPanel.OpacityMask>
                    <VisualBrush Visual="{Binding ElementName=mask}"/>
                </StackPanel.OpacityMask>
                <GridViewRowPresenter Content="{TemplateBinding Content}" Columns="{TemplateBinding GridView.ColumnCollection}"/>
                <TextBlock Background="LightBlue" Text="{Binding News}" />
            </StackPanel>
        </Grid>
    </ControlTemplate>
</Setter.Value>

Пока у меня есть следующее, но я получаю ошибки.

FrameworkElementFactory border = new FrameworkElementFactory(typeof(Border));
border.SetValue(Border.BackgroundProperty, Brushes.White);
border.SetValue(Border.CornerRadiusProperty, new CornerRadius(8, 8, 8, 8));
border.SetValue(Border.NameProperty, "roundedMask");

Насколько я могу сказать, я не могу сделать VisualBrush как FrameworkElementFactory (происходит сбой), но если я объявляю его как обычный элемент VisualBrush, я не могу передать границу как Visual, поскольку это FrameworkElementFactory.

Просто я заблудился, любая помощь будет оценена. Спасибо за любую помощь

 Aaron McIver18 янв. 2011 г., 17:23
Вы знаете, что можете предоставить Имя для рассматриваемого элемента в XAML, а затем сослаться на него в коде, чтобы обеспечить желаемую динамическую возможность. Вам не нужно создавать весь элемент внутри кода.
 Tergiver26 мар. 2011 г., 14:49
Для дальнейшего использования XAML анализируется в C # (или VB в проекте VB). После компиляции поищите в папке .objMyXamlFile.g.cs, Содержит разобранный код.
 George Birbilis16 июл. 2015 г., 15:44
@Tergiver это не точно (по крайней мере, больше) - XAML генерирует .BAML (в WPF), а Codebehind C # / VB и т. Д. Код предназначен для присвоения именованных ссылок переменным класса (codebehind - это частичный класс, который дополняет BAML)

Ответы на вопрос(2)

чтобы применять его динамически. Если вы добавите его в свои ресурсы приложения, в вашем файле App.xaml выполните следующие действия:

<Application.Resources>
    <ControlTemplate TargetType='{x:Type ListViewItem}' x:Key="MyListViewItemTemplate">
        <Grid>
            <Border CornerRadius="15" Name="mask" Background="White"/>
            <StackPanel Background="Beige">
                <StackPanel.OpacityMask>
                    <VisualBrush Visual="{Binding ElementName=mask}"/>
                </StackPanel.OpacityMask>
                <GridViewRowPresenter Content="{TemplateBinding Content}" Columns="{TemplateBinding GridView.ColumnCollection}"/>
                <TextBlock Background="LightBlue" Text="{Binding News}" />
            </StackPanel>
        </Grid>
    </ControlTemplate>
</Application.Resources>

Обратите внимание на атрибут x: Key, который определяет этот элемент.

Затем вы можете найти его в любом месте вашего кода ...

ControlTemplate template = this.Findresource("MyListViewItemTemplate") as ControlTemplate

Затем вы можете применить его как и когда вам это нужно!

 George Birbilis16 июл. 2015 г., 15:46
Из того, что я читал, раньше был инструмент XamlIt, который должен был конвертировать такой XAML в C #, но больше не может найти его в Интернете
 Nithos18 янв. 2011 г., 19:02
Да, это правда, я могу это сделать, но мое любопытство заводит меня, и я действительно хочу знать, как будет выглядеть код C # для этого. Я просто считаю невероятным, насколько труднее сделать это в коде. Иногда это просто не так очевидно. Спасибо за идею, хотя.
Решение Вопроса

Редактировать: Если я не ошибся, это перевод вашего кода ...

Setter setter = new Setter();
setter.Property = ListViewItem.TemplateProperty;
ControlTemplate template = new ControlTemplate(typeof(ListViewItem));
var grid = new FrameworkElementFactory(typeof(Grid));
var border = new FrameworkElementFactory(typeof(Border));
border.SetValue(Border.BackgroundProperty, Brushes.White);
border.SetValue(Border.NameProperty, "mask");
border.SetValue(Border.CornerRadiusProperty, new CornerRadius(15));
grid.AppendChild(border);
var stackPanel = new FrameworkElementFactory(typeof(StackPanel));
stackPanel.SetValue(StackPanel.BackgroundProperty, Brushes.Beige);
var visualBrush = new FrameworkElementFactory(typeof(VisualBrush));
visualBrush.SetBinding(VisualBrush.VisualProperty, new Binding() { ElementName = "mask" });
stackPanel.SetValue(StackPanel.OpacityMaskProperty, visualBrush);
var gridViewRowPresenter = new FrameworkElementFactory(typeof(GridViewRowPresenter));
gridViewRowPresenter.SetValue(GridViewRowPresenter.ContentProperty, new TemplateBindingExtension(GridViewRowPresenter.ContentProperty));
gridViewRowPresenter.SetValue(GridViewRowPresenter.ColumnsProperty, new TemplateBindingExtension(GridView.ColumnCollectionProperty));
stackPanel.AppendChild(gridViewRowPresenter);
var textBlock = new FrameworkElementFactory(typeof(TextBlock));
textBlock.SetValue(TextBlock.BackgroundProperty, Brushes.LightBlue);
textBlock.SetBinding(TextBlock.TextProperty, new Binding("News"));
stackPanel.AppendChild(textBlock);
grid.AppendChild(stackPanel);
template.VisualTree = grid;
setter.Value = template;

Редактировать: Есть еще ошибка,VisualBrush не может быть создано таким образом, остальные, кажется, работают.

 Donald Airey24 февр. 2014 г., 01:24
Застрял в том же месте. Кажется, в FrameworkFactory нет логики для применения дочерних фабрик к открытым свойствам. Это может быть тем, что означает отказ от ответственности за устаревший класс. Существуют различные примеры, показывающие встроенный код XAML, но это также имеет проблемы.
 George Birbilis16 июл. 2015 г., 15:46
возможно, они используют конвертер значений внутри себя, вы можете попытаться найти, какой он есть, и вызвать его
 H.B.16 июл. 2015 г., 22:54
@ GeorgeBirbilis: (Заводской подход все равно не рекомендуется.)
 Nithos18 янв. 2011 г., 21:29
Да, вот что я застрял на. Кажется, вам нужно создать визуальную кисть напрямую, т.е. VisualBrush vbrush = new VisualBrush. Но тогда я не могу передать границу напрямую, так как это не визуальный элемент, а FrameworkElementFactory ... Это та часть, которая меня озадачила ... хотя спасибо за помощь.

Ваш ответ на вопрос