3

インターフェイスに、次のスタイルで定義されたカスタマイズされたボタンがあります。

<Style x:Key="KinectCustomButton" TargetType="k:KinectCircleButton">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="k:KinectCircleButton">
                    <Grid>
                        <Grid.RowDefinitions>
                            <RowDefinition Height="60*"/>
                            <RowDefinition Height="40*"/>
                        </Grid.RowDefinitions>
                        <k:KinectCircleButton Grid.Row="0" VerticalAlignment="Bottom" Foreground="{TemplateBinding Foreground}" Width="{TemplateBinding Width}" Height="{TemplateBinding Height}">
                            <ContentPresenter x:Name="content"/>
                        </k:KinectCircleButton>
                        <ScrollViewer Grid.Row="1">
                            <TextBlock TextAlignment="Center" VerticalAlignment="Top" TextWrapping="Wrap"  Text="{TemplateBinding Label}" Foreground="{TemplateBinding Foreground}"  FontFamily="{TemplateBinding FontFamily}" FontSize="{TemplateBinding FontSize}" FontWeight="{TemplateBinding FontWeight}"/>
                        </ScrollViewer>
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

これらのボタンのうち 6 つをウィンドウでインスタンス化しました。ここで、これらのボタンごとに ScrollViewer 要素にアクセスする必要があります。この方法を試しました:名前またはタイプでWPFコントロールを見つけるにはどうすればよいですか? しかし、それは機能していません。カスタマイズした KinectCustomButton の Template プロパティにもアクセスしようとしましたが、ScrollViewer インスタンスを見つけようとすると、ボタン インスタンスの代わりにテンプレートからのものを取得します (したがって、その中の TextBlock のテキストは空です) )。欲しいものを手に入れる方法はありますか?

4

1 に答える 1

1

ScrollViewerコード内を見つけるには、次の関数を試してGetScrollViewer()ください。

public static DependencyObject GetScrollViewer(DependencyObject Object)
{
    if (Object is ScrollViewer)
    {
        return Object;
    }

    for (int i = 0; i < VisualTreeHelper.GetChildrenCount(Object); i++)
    {
        var child = VisualTreeHelper.GetChild(Object, i);
        var result = GetScrollViewer(child);

        if (result == null)
        {
            continue;
        }
        else
        {
            return result;
        }
    }

    return null;
}

使用例:

if (MyListBox.Items.Count > 0) 
{
    ScrollViewer scrollViewer = GetScrollViewer(MyListBox) as ScrollViewer;

    if (scrollViewer != null)
    {
        scrollViewer.ScrollToVerticalOffset(scrollViewer.VerticalOffset + 20);
    }
}

手続き型コードで UI 要素を操作しないでください

@HighCore は、UI 要素のコードを使用して、MVVM テンプレートを使用するときに妥協する可能性のある XAML コードと C# コードの間のグリップを形成すると言いたかったと思います。

このような関係は、プロジェクトが増加したときに問題を引き起こす可能性があるため、将来的には、UI 要素のStyle/Templateで使用できる動作やコマンドを添付して、UI 要素のロジックを実装してみてください。

于 2013-09-25T16:43:32.490 に答える