Преобразование ControlTemplate XAML в C # - PullRequest
3 голосов
/ 18 января 2011

Я был озадачен попыткой преобразовать следующий код в чистый 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.

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

Ответы [ 2 ]

6 голосов
/ 18 января 2011

На самом деле вам не нужно конвертировать это в C #, чтобы применять его динамически. Если вы добавите его к своим ресурсам приложения, в файле 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

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

3 голосов
/ 18 января 2011

Вы не хотите знать это.Серьезно, нет, это кошмар.

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

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 не может быть создан таким образом, остальные, кажется, работает.

...