19

Windows 8 用の C#/XAML Metro スタイル アプリに取り組んでいます。WinRT の XAML には「タブ」コントロールがありません。ただし、Windows 8 ストアの結果がどのように見えるかをエミュレートしようとしています。たとえば、この画像は「概要」、「詳細」、および「レビュー」タブを示しています。

ここに画像の説明を入力

これらを作成するにはどうすればよいですか?

RadioButton は理にかなっているようです。GroupName を使用して、アイテムが 1 つだけ選択されていることを確認できると考えました。しかし、RadioButton を使用する場合、選択した項目を濃い灰色に見せながら、他のオプションを薄い灰色にする方法がわかりません。少しチェックされたものを表示しないRadioButtonのXAMLを誰かに見せてもらえますか? また、選択されている場合は濃い灰色、選択されていない場合は薄い灰色になります。

どうもありがとう!

4

4 に答える 4

18

ラジオボタンをタブのように見せたり機能させたりするために使用するスタイルは次のとおりです。

    <!-- Style for radio buttons used as tab control -->
<Style x:Key="TabRadioButtonStyle" TargetType="RadioButton">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="RadioButton">
                <Grid>
                    <VisualStateManager.VisualStateGroups>
                        <VisualStateGroup x:Name="CheckStates">
                            <VisualState x:Name="Unchecked">
                                <Storyboard>
                                    <ColorAnimation Duration="0" To="Gray" Storyboard.TargetProperty="(TextBlock.Foreground).(SolidColorBrush.Color)" Storyboard.TargetName="TabButtonText" />
                                </Storyboard>
                            </VisualState>
                            <VisualState x:Name="Indeterminate">
                                <Storyboard>
                                    <ColorAnimation Duration="0" To="White" Storyboard.TargetProperty="(TextBlock.Foreground).(SolidColorBrush.Color)" Storyboard.TargetName="TabButtonText" />
                                </Storyboard>
                            </VisualState>
                            <VisualState x:Name="Checked">
                                <Storyboard>
                                    <ColorAnimation Duration="0" To="Black" Storyboard.TargetProperty="(TextBlock.Foreground).(SolidColorBrush.Color)" Storyboard.TargetName="TabButtonText" />
                                </Storyboard>
                            </VisualState>

                        </VisualStateGroup>
                    </VisualStateManager.VisualStateGroups>
                    <TextBlock x:Name="TabButtonText" Text="{TemplateBinding Content}" Style="{StaticResource GroupHeaderTextStyle}" HorizontalAlignment="Left"/>
                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

次に、タブスタックパネルを保持するグリッドと、各タブに関連付けられたコンテンツを保持するフレームを定義できます。ラジオボタンのClickイベントを使用して、フレームを各「タブ」の適切なページに移動します。

 <Grid Grid.Row="1"
        Margin="120,0,56,56">
        <!-- Row 1 to hold the "Tabs", Row 2 to hold the content -->
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="*" />
        </Grid.RowDefinitions>
        <StackPanel Grid.Row="0" Orientation="Horizontal">
            <RadioButton x:Name="Tab1" Content="Tab1" Style="{StaticResource TabRadioButtonStyle}" IsChecked="True" Click="Tab1_Clicked" />
            <RadioButton x:Name="Tab2" Content="Tab2" Style="{StaticResource TabRadioButtonStyle}" IsChecked="False" Click="Tab2_Clicked" Margin="30,0,0,0" />
            <RadioButton x:Name="Tab3" Content="Tab3" Style="{StaticResource TabRadioButtonStyle}" IsChecked="False" Click="Tab3_Clicked" Margin="30,0,0,0"/>
        </StackPanel>
        <Frame x:Name="ContentFrame" Margin="0,20,0,0" Grid.Row="1" Background="{StaticResource SandstormBackgroundBrush}" Loaded="ContentFrame_Loaded" />
    </Grid>
于 2012-09-21T01:27:47.677 に答える
6

ListBox のスタイル設定は、ラジオ ボタン グループのスタイル設定よりも推奨されます。

次のコードは、水平スタック パネルを持つ ListBox を使用して、タブ項目ヘッダーを作成します。ContentControl は、タブのコンテンツをユーザー コントロールとして表示します。

これは WPF でしかテストしていませんが、WinRT でも動作することを願っています。

ここに画像の説明を入力

<Page.Resources>
    <Style TargetType="ListBoxItem">
        <!-- disable default selection highlight -->
        <!-- Style.Resources is not supported in WinRT -->
        <!--<Style.Resources>
            --><!-- SelectedItem with focus --><!--
            <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" 
                            Color="Transparent" />
            --><!-- SelectedItem without focus --><!--
            <SolidColorBrush x:Key="{x:Static SystemColors.ControlBrushKey}" 
                            Color="Transparent" />
        </Style.Resources>-->
        <!--Setter Property="FocusVisualStyle" is not supported in WinRT -->
        <!--<Setter Property="FocusVisualStyle" Value="{x:Null}" />-->
    </Style>
    <Style x:Key="TitleStyle" TargetType="TextBlock">
        <Setter Property="Foreground" Value="LightGray"/>
        <!--Style.Triggers is not supported in WinRT-->
        <!--<Style.Triggers>
            <DataTrigger Value="True" Binding="{Binding Path=IsSelected, 
                        RelativeSource={RelativeSource Mode=FindAncestor, 
                        AncestorType={x:Type ListBoxItem}}}">
                <Setter Property="Foreground" Value="DarkGray"/>
                <Setter Property="FontWeight" Value="Bold"/>
            </DataTrigger>
        </Style.Triggers>-->
    </Style>
</Page.Resources>
<Grid>
    <Grid.DataContext>
        <ViewModel:TestPage/>
    </Grid.DataContext>
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto"/>
        <RowDefinition/>
    </Grid.RowDefinitions>

    <ListBox x:Name="tabListBox" Grid.Row="0" ItemsSource="{Binding Items}" 
                        SelectedItem="{Binding SelectedItem, Mode=TwoWay}" 
                        BorderBrush="{x:Null}" BorderThickness="0">
        <ListBox.ItemsPanel>
            <ItemsPanelTemplate>
                <StackPanel Orientation="Horizontal" />
            </ItemsPanelTemplate>
        </ListBox.ItemsPanel>
        <ListBox.ItemTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding Title}" Margin="5" 
                        Style="{StaticResource TitleStyle}"/>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>

    <ContentControl Grid.Row="1" Content="{Binding SelectedItem.Content}"/>
</Grid>

モデルを見る

public class MyTabViewModel : INotifyPropertyChanged
{
    public MyTabViewModel()
    {
        Items =
            new List<MyTabItem>
                {
                    new MyTabItem
                        {
                            Title = "Overview",
                            Content = new UserControl1()
                        },
                    new MyTabItem
                        {
                            Title = "Detail",
                            Content = new UserControl2()
                        },
                    new MyTabItem
                        {
                            Title = "Reviews",
                            Content = new UserControl3()
                        },
                };
    }

    public IEnumerable<MyTabItem> Items { get; private set; }

    private MyTabItem _selectedItem;

    public MyTabItem SelectedItem
    {
        get { return _selectedItem; }
        set
        {
            _selectedItem = value;
            PropertyChanged(this, new PropertyChangedEventArgs("SelectedItem"));
        }
    }

    #region Implementation of INotifyPropertyChanged

    public event PropertyChangedEventHandler PropertyChanged;

    #endregion
}

public class MyTabItem
{
    public string Title { get; set; }
    public UserControl Content { get; set; }
}
于 2012-05-24T20:42:59.937 に答える
5

FlipView コントロールがニーズを満たす 場合があります。サンプル

于 2012-05-24T21:20:50.657 に答える
0

コントロールも使用FlipViewしましたが、 から継承された別のテンプレート コントロールを作成しましたFlipView

主なアイデアは default をオーバーライドすることです。タブ ヘッダーを表すFlipView ControlTemplateを追加し、ListBox[次​​へ] および [前へ]FlipViewボタンを削除しました。

私の実装に関する詳細が必要な場合は、ソース コードを共有できます。

于 2013-07-04T09:39:24.230 に答える