2011-01-18 26 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(クラッシュ)とたVisualBrushを作るカント伝えることができますが、私は定期的な要素たVisualBrushとしてそれを宣言する場合、私はそのFrameworkElementFactory以来、ビジュアルなどで国境を通過するカントとして
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"); 

私は迷子になってしまいました。何か助けていただければ幸いです。 ありがとうございました

+1

XAML内で問題の要素に名前を指定し、コード内でその名前を参照して、必要な動的機能を提供することができます。コード内の要素全体を構築する必要はありません。 –

+0

将来参照するために、XAMLはC#(またはVBプロジェクトのVB)に解析されます。コンパイルした後、.objフォルダ内で 'MyXamlFile.g.cs'を探します。これは解析されたコードを含んでいます。 – Tergiver

+1

@Tergiverこれは正確ではありません(少なくともそれ以上はありません) - XAMLは.BAML(WPFで)とCodebehind C#/ VBなどを生成します。コードはクラス変数に名前付き参照を割り当てるためのコードです(codebehindはBAMLを補完する部分クラスです) –

答えて

3

あなたはこれを知りたくありません。真剣に、あなたはそうではありません、それは悪夢です。

編集:私はどんなミスをしなかった場合、これはあなたのコードの翻訳です...

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は次のように作成することができません残りはうまくいくようです。

+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> 

この項目をキーするx:Key属性に注意してください。

あなたはその後、どこでも、あなたのコードでそれを見ることができます...

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

あなたがそれを必要とし、ときにそれを適用することができます!

+0

はいthats true私はそれを行うことができますが、私の好奇心が私を得て、私は本当にC#コードがどのように見えるか知りたいです。コードでこれを行うことがどれほど難しいかは信じられません。時には明らかにそれほど明白ではない。しかし、アイデアをありがとう。 – Nithos

+0

私はこれまでXAMLをC#に変換することができるはずだが、それをオンラインで見つけることができないはずのXamlItツールを使用していた。 –

関連する問題