有没有办法使用c#为Windows 8商店应用缩进列表视图中的某些项目?

时间:2014-12-16 18:10:57

标签: c# windows xaml windows-8 windows-store-apps

基本上,我有一个项目和子项目列表(全部在一个列表中)。我想缩进某些实际子项的特定项目。有没有我可以用来做这个的功能或属性?我已经尝试使用谷歌搜索,甚至在堆栈溢出时搜索它 - 但没有成功。

注意:我在Windows 8商店应用程序中使用C#和XAML。不是wpf应用程序(文档和代码有时会有所不同)。

编辑:

这是我的XAML的样子:

<ListView
            x:Name="ListView"
            AutomationProperties.AutomationId="ListView"
            AutomationProperties.Name="items"
            TabIndex="1"
            Grid.Row="1"
            Margin="-10,-10,0,0"
            Padding="20,0,0,45"
            IsSwipeEnabled="False"
            SelectionChanged="ListView_SelectionChanged">
            <ListView.ItemTemplate>
                <DataTemplate>
                    <Grid Margin="1">
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="Auto"/>
                            <ColumnDefinition Width="*"/>
                        </Grid.ColumnDefinitions>
                        <StackPanel Grid.Column="0" Margin="10,0,0,0">
                            <TextBlock x:Name="Item" Tag="{Binding ID}" Text="{Binding Name}" Style="{StaticResource TitleTextBlockStyle}" TextWrapping="Wrap" MaxHeight="40" FontSize="14" FontFamily="Global User Interface"/>
                        </StackPanel>
                    </Grid>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>

列表视图绑定到一个可观察的对象列表。

2 个答案:

答案 0 :(得分:1)

如果您只想缩进子项的文本,可以更改文本块或堆栈面板的边距。 为此,您将执行以下操作:

  1. 为要添加到列表视图的项目创建一个类

  2. 向该类添加一个IsSubItem属性

  3. 创建这些项目的可观察集合,并将它们绑定到列表视图源。

  4. 在ListView模板中,使用转换器将堆栈面板或文本块边距绑定到IsSubItem属性,以将IsSubItem布尔值转换为适当的边距。

答案 1 :(得分:1)

要在此处进一步扩展另一个答案...建议的路由是向基础类(在本例中为MyClass)添加属性,并将ListView的ItemsSource绑定到这些对象的列表。

public class MyClass
{
    public bool IsSubItem { get; set; }
}

// Elsewhere in your code, you would need a list of these object
public ObservableCollection<MyClass> MyList { get; set; }

您还需要一个Converter类,它很容易设置: 你需要一个转换器类;一旦你掌握了它们,转换器就很容易了。这种情况的一个简单示例是:

public class BoolToMarginConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, string language)
    {
        //Get the passed in value and convert it to a boolean - the as keyword returns a null if we can't convert to a boolean so the ?? allows us to set a default value if we get a null instead
        bool isSubItem = (value as bool?) ?? false;
        // If the item IS a sub item, we want a larger Left Margin
        // Since the Margin Property expects a Thickness, that's what we need to return
        return new Thickness(isSubItem == true ? 24 : 12, 0, 0, 0);
    }

    // This isn't necessary in most cases, and in this case can be ignored (just required for the Interface definition)
    public object ConvertBack(object value, Type targetType, object parameter, string language)
    {
        throw new NotImplementedException();
    }
}

完成此设置后,您需要将其作为资源添加到XAML中:

// Add a reference to your namespace if it isn't already in your XAML
xmlns:local="using:MyNamespace"

// You'll also need to add a static resource
<Page.Resources>
    <local:BoolToMarginConverter x:Key="BoolToMarginConverter" />
</Page.Resources>

// And then lastly, you'll need to update your ListView XAML to use the new information
<ListView
        x:Name="ListView"
        ItemsSource={Binding MyList}
        <!-- Other Properties removed for space -->
        <ListView.ItemTemplate>
            <DataTemplate>
                <Grid Margin="1">
                    <!-- Other info removed for space -->
                    <StackPanel Grid.Column="0" Margin="{Binding Path=IsSubItem, Converter={StaticResource BoolToMarginConverter}}">
                        <!-- Other info removed for space -->
                    </StackPanel>
                </Grid>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>