控制模板Xaml

时间:2014-01-08 07:31:21

标签: c# xaml windows-phone-8 microsoft-metro resourcedictionary

我对下面定义的控件模板上的某些元素进行了绑定,这个模板在我的自定义ResourceDictionary中定义,并被指定为MainPage.xaml中ContentControl的模板,我想要做的是绑定到元素属性我想通过Resistering DependencyProperties更改Code-Behind MainPage中的值,问题是它无法正常工作,例如在代码中使用“GPBaseBannerImage”代码中的getter .Source返回null,显然它什么都没发现....我认为我的ResourceDictionary ....的模板定义中的绑定是错误的。

<ControlTemplate x:Key="GPBaseTemplate" TargetType="ContentControl">
    <ContentPresenter>
        <Canvas x:Name="GPBaseCanvas" 
                Background="{StaticResource GPBaseBgBrush}" 
                HorizontalAlignment="Stretch" 
                VerticalAlignment="Stretch">

            <Image x:Name="GPBaseBannerImage" Source="{Binding Source}" 
                   Stretch="{Binding Stretch}"/>
                <Image.RenderTransform>
                    <TransformGroup>
                        <TranslateTransform X="{Binding X}" Y="{Binding Y}"/>
                    </TransformGroup>
                </Image.RenderTransform>
            </Image>

            <Grid x:Name="GPBaseGrid">
                <Grid.RowDefinitions>
                    <RowDefinition Height="Auto"/>
                </Grid.RowDefinitions>

                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="Auto"/>
                    <ColumnDefinition Width="*"/>
                </Grid.ColumnDefinitions>

                <Grid.RenderTransform>
                     <TranslateTransform X="0" Y="50" />
                </Grid.RenderTransform>

                <StackPanel x:Name="GPBaseContentPanel"
                            Background="{Binding Background}"
                            VerticalAlignment="{Binding VerticalAlignment}" 
                            HorizontalAlignment="{Binding HorizontalAlignment}" 
                            Width="{Binding Width}"
                            Height="{Binding Height}"
                            Grid.Row="0"
                            Grid.Column="0"/>

                <StackPanel x:Name="GPBaseBtnPanel"
                            Background="Transparent"
                            HorizontalAlignment="Right"
                            VerticalAlignment="Center"
                            Grid.Row="0"
                            Grid.Column="1">

                    <Button x:Name="GPBaseBtn_1"
                            Style="{StaticResource GPBaseBtnStyle}"
                            Background="{Binding Background}"
                            Click="{Binding Click}"/>

                    <Button x:Name="GPBaseBtn_2"
                            Style="{StaticResource GPBaseBtnStyle}"
                            Background="{Binding Background}"
                            Click="{Binding Click}"/>

                    <Button x:Name="GPBaseBtn_3"
                            Style="{StaticResource GPBaseBtnStyle}"
                            Background="{Binding Background}"
                            Click="{Binding Click}"/>

                    <Button x:Name="GPBaseBtn_4"
                            Style="{StaticResource GPBaseBtnStyle}"
                            Background="{Binding Background}"
                            Click="{Binding Click}"/>

                    <Button x:Name="GPBaseBtn_5"
                            Style="{StaticResource GPBaseBtnStyle}"
                            Background="{Binding Background}"
                            Click="{Binding Click}"/>

                </StackPanel>

            </Grid>

        </Canvas>
    </ContentPresenter>
</ControlTemplate>

我认为我没有正确使用它,因为我得到一个未处理的例外,任何帮助都将不胜感激。

干杯

2 个答案:

答案 0 :(得分:0)

您没有关闭箭头,只是粘贴错误或?

<Image x:Name="GPBaseBannerImage" Source="{Binding Source}" 
               Stretch="{Binding Stretch} <----- ???
            <Image.RenderTransform>
                <TransformGroup>
                    <TranslateTransform X="{Binding X}" Y="{Binding Y}"/>
                </TransformGroup>
            </Image.RenderTransform>
        </Image>

* ControlTemplate用法*

 <ContentControl x:Name="GPMainMenuContentControl" 
                 Template="{Binding Source={StaticResource GPBaseTemplate} }" >


 </ContentControl>

答案 1 :(得分:0)

好的,我发现了我的问题,我需要在使用我的自定义模板的对象上设置DataContext,在这种情况下它是一个ContentControl,但是在Xaml中控件上设置DataContext由于某种原因不起作用,我必须在代码后面设置它,然后在GPBaseTemplateHelper的属性setter(set; Not Xaml Setter)中调用NotifyPropertyChanged。

    public MainMenuPage()
    {
        InitializeComponent();
        BaseTemplateHelper = new GPBaseTemplateHelper();

        if (BaseTemplateHelper != null)
        {
            this.DataContext = BaseTemplateHelper;
        }
    }