2011-01-18 2 views
3

Я был в тупике с попыткой конвертировать следующий код в чистый C#. Этот код XAML из блога Cavanaghs о том, как сделать закругленные углы на чем угодно. Код работает, но мне нужно преобразовать его в C#, поскольку мне нужно, чтобы он был динамическим в некоторых случаях. Если бы вы могли помочь, это было бы здорово.Преобразование ControlTemplate XAML в 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 (падения), но если я объявляю его как обычный элемент визуала я не могу пройти границу в качестве Визуального с момента его в FrameworkElementFactory.

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

+1

Вы знаете, что вы можете предоставить имя соответствующему элементу в XAML, затем ссылаться на него в коде, чтобы обеспечить требуемую динамическую возможность. Вам не нужно создавать весь элемент внутри кода. –

+0

Для дальнейшего использования XAML анализируется на C# (или VB в проекте VB). После компиляции загляните в папку .obj для 'MyXamlFile.g.cs'. Он содержит проанализированный код. – Tergiver

+1

@Tergiver это неточно (по крайней мере, не больше) - XAML генерирует .BAML (в WPF) и Codebehind C#/VB и т. Д. Код предназначен для назначения именованных ссылок на переменные класса (codebehind - это частичный класс, который дополняет BAML) –

ответ

3

Вы не хотите знать это. Серьезно, вы этого не сделаете, это кошмар.

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

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; 

Edit: Существует еще ошибка ушла, VisualBrush не может быть создана как что, похоже, все работает.

+0

Правильно, вот что я застрял. Кажется, вам нужно создать визуальную кисть напрямую, т.е. VisualBrush vbrush = new VisualBrush. Но тогда я не могу передать границу напрямую, так как это не визуальный, а FrameworkElementFactory ... Это та часть, которая заставила меня замолчать ... спасибо за помощь. – Nithos

+0

Застрял точно в том же месте.В FrameworkFactory нет никакой логики для применения дочерних фабрик к открытым свойствам. Возможно, это то, о чем говорит отказ от устаревшего класса. Существуют различные примеры, показывающие встроенный код XAML, но это также имеет проблемы. –

+0

Возможно, они используют внутренний преобразователь значений, вы можете попытаться найти, какой он есть, и назовите его –

6

Вам действительно не нужно преобразовывать это в 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> 

Обратите внимание на й: Ключ атрибут, какие клавиши этого элемента.

Вы можете посмотреть его в любом месте вашего кода ...

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

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

+0

Да, это правда, я могу это сделать, но мое любопытство вызывает меня, и я действительно хочу знать, как выглядит код C# для этого. Я просто считаю невероятным, насколько сложнее это сделать в коде. Его просто не так очевидно. Спасибо за эту идею. – Nithos

+0

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

Смежные вопросы