Discussion:
wpf TextBox soll einen Listview horizontal ausfüllen
(zu alt für eine Antwort)
Winfried Wille
2009-03-29 12:08:00 UTC
Permalink
Hallo,

hier der Code:
<DockPanel Name="dpContent">
<ListBox Name="lbContent" Visibility="Visible"
DockPanel.Dock="Left"
Background="#FF808080" ItemsSource="{Binding}"
IsSynchronizedWithCurrentItem="True" Width="Auto">
<ListBox.ItemTemplate>
<DataTemplate>
<TextBox Text="{Binding Path=Name}"
IsHitTestVisible="False" Background="#00FFFFFF"
HorizontalAlignment="Stretch">
</TextBox>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox >
<TabControl Name="tcItems">
...
Obwohl ich der TextBox ein HorizontalAlignment von "Stretch" gebe, füllt
Sie die eine Spalte vom Listview horiontal nicht aus.
Ärgerlich da die Textbox einen Rand hat und auf Klicks reagieren soll.
Weiss irgendjemand, wie ich die Textbox stretche, so das Sie horizontal die
Spalte vom Listview füllt.

Viele Grüße
Winfried Wille
Elmar Boye
2009-03-29 14:08:16 UTC
Permalink
Hallo Winfried,
Post by Winfried Wille
Hallo,
<DockPanel Name="dpContent">
<ListBox Name="lbContent" Visibility="Visible"
DockPanel.Dock="Left"
Background="#FF808080" ItemsSource="{Binding}"
IsSynchronizedWithCurrentItem="True" Width="Auto">
<ListBox.ItemTemplate>
<DataTemplate>
<TextBox Text="{Binding Path=Name}"
IsHitTestVisible="False" Background="#00FFFFFF"
HorizontalAlignment="Stretch">
</TextBox>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox >
<TabControl Name="tcItems">
...
Obwohl ich der TextBox ein HorizontalAlignment von "Stretch" gebe,
füllt Sie die eine Spalte vom Listview horiontal nicht aus.
Gib es auf der Ebene der Listbox an via
HorizontalContentAlignment="Stretch"
Post by Winfried Wille
Ärgerlich da die Textbox einen Rand hat und auf Klicks reagieren soll.
Und wieso hast Du IsHitTestVisible deaktiviert?
Erforderlich um Änderungen mitzukriegen ist das nicht.
Die ListBox reagiert auch so auf die Auswahl mit einem
SelectionChanged Ereignis, wo Du das zugrundeliegende
Element ermitteln kannst.

Für die Anzeige selbst ist es effizienter einen TextBlock anstatt
der TextBox zu verwenden. Und wenn Du ein Rähmchen drumherum haben
möchtest, dazu ein Border Element.

Das könnte z. B. so aussehen:

<ListBox x:Name="lbContent"
DockPanel.Dock="Left"
Background="Gray"
ItemsSource="{Binding}"
IsSynchronizedWithCurrentItem="True"

HorizontalContentAlignment="Stretch"
SelectionChanged="lbContent_SelectionChanged">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel>
<Border BorderBrush="Blue" BorderThickness=".25" Padding="2">
<TextBlock Text="{Binding Path=Name}" Background="DarkGray"/>
</Border>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>


Gruß Elmar
Winfried Wille
2009-03-29 15:01:41 UTC
Permalink
Hallo Elmar und Frank,
HorizontalContentAlignment="Stretch" löst das Problem, vielen Dank.
Ist gur möglich, das ich von TextBox noch auf TectBlock umstelle
Post by Elmar Boye
Gib es auf der Ebene der Listbox an via
HorizontalContentAlignment="Stretch"
Viele Grüsse
Winfried Wille
Frank Dzaebel
2009-03-29 18:25:52 UTC
Permalink
Hallo Winfried,
[...] HorizontalContentAlignment="Stretch" löst das Problem, vielen Dank.
ok.
Ist gur möglich, das ich von TextBox noch auf TectBlock umstelle
ja, der TextBlock ist als Control leichtgewichtiger als
eine TextBox, kann aber natürlich auch nicht das, was die
TextBox kann. Es gilt grob (in WPF) :

Benutze eine TextBox, wenn Du:
- Text Selektion
- oder Editierbarkeit
benötigst.

Benutze einen TextBlock oder einen Label, wenn Du nur:
- Text anzeigen willst.


Wenn Du also z.B. mal ein EditTemplate willst, nimm z.B. die TextBox:

[WPF Data Templates Part 5 - Editing data in a Data Template and Switching a
template on a Single item programmatically : Coding Bandit]
http://codingbandit.com/Blog/blog/wpf-data-templates-part-5-ndash-editing-data-in-a-data-template-and-switching-a-template-on-a-single-item-programmatically/



Weitere Performance-Tips diesbzgl.:

[Optimieren der Leistung: Text]
http://msdn.microsoft.com/de-de/library/bb613560.aspx

[Optimieren der WPF-Anwendungsleistung]
http://msdn.microsoft.com/de-de/library/aa970683.aspx


ciao Frank
--
Dipl.Inf. Frank Dzaebel [MCP/MVP C#]
http://Dzaebel.NET
Frank Dzaebel
2009-03-29 14:20:18 UTC
Permalink
Hallo Winfried,
Post by Winfried Wille
Obwohl ich der TextBox ein HorizontalAlignment von "Stretch" gebe,
nimm "HorizontalContentAlignment" für die ListBox:

<ListBox
Name="lbContent" Visibility="Visible"
DockPanel.Dock="Left"
Background="#FF808080" ItemsSource="{Binding}"
HorizontalContentAlignment="Stretch"
IsSynchronizedWithCurrentItem="True" Width="135">
<ListBox.ItemTemplate>
<DataTemplate>
<TextBox
Text="{Binding Path=Name}"
IsHitTestVisible="False" Background="#00FFFFFF">
</TextBox>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox >


ciao Frank
--
Dipl.Inf. Frank Dzaebel [MCP/MVP C#]
http://Dzaebel.NET
Loading...