Laden...

ListView -> TileView aber wie?

Erstellt von Taladan vor 14 Jahren Letzter Beitrag vor 14 Jahren 4.498 Views
Taladan Themenstarter:in
582 Beiträge seit 2008
vor 14 Jahren
ListView -> TileView aber wie?

Hallo,

zu WindowsFormszeiten war es noch ganz einfach, einer ListView eine Tileview hinzu zu fügen. Aber wie macht man das bei WPF? Auch eine googlerecherche brachte mir bisher nur immer wieder gridviews zu tage. Aber nirgends eine Tileview?

Gruß dat Tala

U
1.578 Beiträge seit 2009
vor 14 Jahren

ich wuesste nicht das eine listview das kann
aber das ist kein problem
pack einfach eine listbox dazu und binden die auf das selbe item
und je nachdem was sichtbar sein soll laesst du die listview oder die listbox anzeigen

zb

<Grid>
    <ListView ItemsSource="{Binding Files}" Visibility="{Binding IsDetails, Converter={StaticResource BoolToVisibility}}" />
    <ListBox ItemsSource="{Binding Files}" Visibility="{Binding IsTiles, Converter={StaticResource BoolToVisibility}}" />
</Grid>
Taladan Themenstarter:in
582 Beiträge seit 2008
vor 14 Jahren

Sorry ich glaub, du meinst was ganz anderes.

Alle Elemente sollen nicht in einer Liste dargestellt werden, sondern in Kacheln. Beste Beispiel für eine ListView ist der WindowsExplorer. Der die Ordner in verschiednen Detaillisten und Detailkacheln darstellen kann.

Ich habe dieses Beispiel gefunden. Aber es scheint fehlerhaft zu sein. Bei mir verändert sich die anzeige kein bissl
http://msdn.microsoft.com/de-de/library/ms748859.aspx

Gruß dat Tala

6.862 Beiträge seit 2003
vor 14 Jahren

Hallo,

das Beispiel funktioniert auf jeden Fall. Hast du nur den Code kopiert und bei dir eingebaut? Falls ja, ist da was schiefgegangen. Der Artikel verweist ja auch auf das komplette Beispiel. Einfach runterladen, kompilieren und ausführen.

Baka wa shinanakya naoranai.

Mein XING Profil.

Taladan Themenstarter:in
582 Beiträge seit 2008
vor 14 Jahren

Beides schon gemacht. Ich finde den Fehler nicht. Wahrscheinlich im XAML.

Es wird einfach nichts angezeigt sobald ich mein ein PlainView angewählt wird.

Gruß dat Tala

Taladan Themenstarter:in
582 Beiträge seit 2008
vor 14 Jahren

So jetzt noch mal mit Code.

Ich habe mich komplett an die Vorgaben gehalten. Wahrscheinlich sehe ich den Wald vor lauter bäumen nicht. Ich bekomme immer noch eine Auflistung statt Kacheln. Es ist so, als würde mein Datatemplate gar nicht verwendet werden. Aber der Debugger meckert auch nicht rum.


<UserControl x:Class="InsideKomponents.ExtendetListView"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:l="clr-namespace:InsideKomponents"
    >
    <UserControl.Resources>

        
        <!--PlainView Default Style for ListView-->
        <!--<SnippetPlainViewStyle>-->
        <Style x:Key="{ComponentResourceKey TypeInTargetAssembly={x:Type l:PlainView}, ResourceId=myPlainViewDSK}" TargetType="{x:Type ListView}" BasedOn="{StaticResource {x:Type ListBox}}">
            <Setter Property="HorizontalContentAlignment" Value="Center"/>
            <Setter Property="ItemContainerStyle"  Value="{Binding (ListView.View).ItemContainerStyle, RelativeSource={RelativeSource Self}}"/>
            <Setter Property="ItemTemplate" Value="{Binding (ListView.View).ItemTemplate, RelativeSource={RelativeSource Self}}"/>
            <Setter Property="ItemsPanel">
                <Setter.Value>
                    <ItemsPanelTemplate>
                        <WrapPanel Width="{Binding (FrameworkElement.ActualWidth), RelativeSource={RelativeSource AncestorType=ScrollContentPresenter}}"
                                   ItemWidth="{Binding (ListView.View).ItemWidth, RelativeSource={RelativeSource AncestorType=ListView}}"
                                   MinWidth="{Binding ItemWidth, RelativeSource={RelativeSource Self}}" 
                                   ItemHeight="{Binding (ListView.View).ItemHeight, RelativeSource={RelativeSource AncestorType=ListView}}"/>
                    </ItemsPanelTemplate>
                </Setter.Value>
            </Setter>
        </Style>
        <!--</SnippetPlainViewStyle>-->


        <!-- <Grid> -->
        <GridView x:Key="gridView">
            <GridViewColumn Header="Name" DisplayMemberBinding="{Binding Path=Name}"/>
            <GridViewColumn Header="Kategorien" DisplayMemberBinding="{Binding Path=Category}" />
        </GridView>
        <!-- </Grid> -->

        <!-- <IconView> -->
        <DataTemplate x:Key="iconTemplate" DataType="{x:Type l:ArchivItem}">
            <DockPanel Height="33" Width="150">
                <TextBlock DockPanel.Dock="Top" Text="{Binding Path=Name}" 
                     FontSize="13" HorizontalAlignment="Left" 
                     Margin="0,0,0,1" />
                <TextBlock Text="{Binding Path=Category}" FontSize="9" 
                     HorizontalAlignment="Left" Margin="0,0,0,1" />
            </DockPanel>
        </DataTemplate>

        <l:PlainView x:Key="iconView" 
                   ItemTemplate="{StaticResource iconTemplate}" 
                   ItemWidth="150"/>
        <!-- </IconView> -->
        
        
        
        
    </UserControl.Resources>
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition />
            <RowDefinition Height="Auto" />
        </Grid.RowDefinitions>

        <ListView Name="lv" FontSize="12" Background="LightBlue" 
                   >
            <ListView.ContextMenu>
                <ContextMenu>
                    <MenuItem Header="GridView" Click="SwitchViewMenu"/>
                    <MenuItem Header="IconView" Click="SwitchViewMenu"/>
                    <MenuItem Header="TileView" Click="SwitchViewMenu"/>
                    <MenuItem Header="OneButtonHeaderView" Click="SwitchViewMenu"/>
                </ContextMenu>
            </ListView.ContextMenu>


        </ListView>

        <StackPanel Grid.Row="1" Background="White">
            <TextBlock FontSize="16" Foreground="Blue">
                CurrentView: <TextBlock Name="currentView"/>
            </TextBlock>
            <TextBlock>
                Right-click in the content window to change the view.
            </TextBlock>
        </StackPanel>
    </Grid>
</UserControl>



Gruß dat Tala

Taladan Themenstarter:in
582 Beiträge seit 2008
vor 14 Jahren

Ich habe jetzt raus gefunden was fehlte. Ich hatte das ganze in einen externen Assembly und in diesen fehlte folgender Eintrag.



[assembly: ThemeInfo(
    ResourceDictionaryLocation.None, //Speicherort der designspezifischen Ressourcenwörterbücher
    //(wird verwendet, wenn eine Ressource auf der Seite
    // oder in den Anwendungsressourcen-Wörterbüchern nicht gefunden werden kann.)
    ResourceDictionaryLocation.SourceAssembly //Speicherort des generischen Ressourcenwörterbuchs
    //(wird verwendet, wenn eine Ressource auf der Seite, in der Anwendung oder einem 
    // designspezifischen Ressourcenwörterbuch nicht gefunden werden kann.)
)]


Wie kann ich verhindern, das ich überhaupt eine Themesdatei brauche?

Gruß dat Tala

5.742 Beiträge seit 2007
vor 14 Jahren

Wie kann ich verhindern, das ich überhaupt eine Themesdatei brauche?

Ich glaube, das geht nicht.

Zumindest ein Projekt mit einer solchen Datei brauchst du.

Wenn man das MSDN-Beispiel geringfügig anpasst:


public sealed class PlainView 
    : ViewBase
{
    public static readonly DependencyProperty ItemContainerStyleProperty = ItemsControl.ItemContainerStyleProperty.AddOwner(typeof(PlainView));
    public static readonly DependencyProperty ItemTemplateProperty = ItemsControl.ItemTemplateProperty.AddOwner(typeof(PlainView));
    public static readonly DependencyProperty ItemsPanelProperty = ItemsControl.ItemsPanelProperty.AddOwner(typeof(PlainView));

    public Style ItemContainerStyle
    {
        get
        {
            return (Style) this.GetValue(PlainView.ItemContainerStyleProperty);
        }
        set
        {
            this.SetValue(PlainView.ItemContainerStyleProperty, value);
        }
    }
    public DataTemplate ItemTemplate
    {
        get
        {
            return (DataTemplate) this.GetValue(PlainView.ItemTemplateProperty);
        }
        set
        {
            this.SetValue(PlainView.ItemTemplateProperty, value);
        }
    }
    public ItemsPanelTemplate ItemsPanel
    {
        get
        {
            return (ItemsPanelTemplate) this.GetValue(PlainView.ItemsPanelProperty);
        }
        set
        {
            this.SetValue(PlainView.ItemsPanelProperty, value);
        }
    }
    protected override object DefaultStyleKey
    {
        get
        {
            return new ComponentResourceKey(this.GetType(), "Style");
        }
    }
}


<Style x:Key="{ComponentResourceKey TypeInTargetAssembly={x:Type local:PlainView}, ResourceId=Style}"
           TargetType="{x:Type ListView}"
           BasedOn="{StaticResource {x:Type ListBox}}">
        <Setter Property="HorizontalContentAlignment"
                Value="Center" />
        <Setter Property="ItemContainerStyle"
                Value="{Binding (ListView.View).ItemContainerStyle, RelativeSource={RelativeSource Self}}" />
        <Setter Property="ItemTemplate"
                Value="{Binding (ListView.View).ItemTemplate, RelativeSource={RelativeSource Self}}" />
        <Setter Property="ItemsPanel"
                Value="{Binding (ListView.View).ItemsPanel, RelativeSource={RelativeSource Self}}" />
    </Style>

Kann man sogar das ItemPanel komfortabel anpassen.