gpt4 book ai didi

wpf - ListBox 或 ItemsControl 项目不占用所有可用空间

转载 作者:行者123 更新时间:2023-12-02 08:49:48 25 4
gpt4 key购买 nike

抱歉,如果之前已经回答过这个问题;我在这里查看了类似的帖子,但建议的修复方法对我不起作用。

我正在处理一个 Silverlight 3 项目,我有以下内容:

<ListBox ItemsSource="{Binding}" 
ItemTemplate="{StaticResource TemplateSelector}"
>
<ListBox.ItemContainerStyle>
<Style TargetType="ListBoxItem">
<Setter Property="HorizontalContentAlignment" Value="Stretch" />
</Style>
</ListBox.ItemContainerStyle>
</ListBox>

ListBox 绑定(bind)到一个源,它使用我在 Silverlight 中实现的 DataTemplateSelector 使用不同的 DataTemplate。

ListBox 似乎忽略了样式属性 Horizo​​ntalContentAlignment,即我无法让项目拉伸(stretch)到 ListBox 的整个宽度。

我的数据模板是这样的:

<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding DisplayName}" />
<TextBox Text="{Binding Value}" Name="{Binding ID}"/>
</StackPanel>

基本上,我希望项目填满 ListBox 控件的所有可用空间,并共享它们,以便左半部分空间由 TextBlock 占用,右半部分由 TextBox 占用。

关于如何做到这一点有什么想法吗?

编辑:@wdavo:这是 TemplateSelector 代码:

// http://www.codeproject.com/Articles/92439/Silverlight-DataTemplateSelector
public abstract class DataTemplateSelector : ContentControl
{
public virtual DataTemplate SelectTemplate(
object item, DependencyObject container)
{
return null;
}

protected override void OnContentChanged(object oldContent, object newContent)
{

base.OnContentChanged(oldContent, newContent);
ContentTemplate = SelectTemplate(newContent, this);
}
}
public class MyTemplateSelector : DataTemplateSelector
{
public DataTemplate MyTemplate1 { get; set; }
public DataTemplate MyTemplate2 { get; set; }
public DataTemplate MyTemplate3 { get; set; }

public override DataTemplate SelectTemplate(object item, DependencyObject container)
{
var element = item;

if (element.GetType() == typeof(MyType1))
return MyTemplate1;
else if (element.GetType() == typeof(MyType2))
return MyTemplate2;
else if (element.GetType() == typeof(MyType3))
return MyTemplate3;

return base.SelectTemplate(item, container);
}
}

和 xaml:

<DataTemplate x:Key="TemplateSelector">
<local:MyTemplateSelector Content="{Binding}">
<local:MyTemplateSelector.MyTemplate1>
<DataTemplate>
<StackPanel >
<TextBlock Text="{Binding DisplayName}" />
<TextBox Text="{Binding Value}" Name="{Binding ID}" />
</StackPanel>
</DataTemplate>
</local:MyTemplateSelector.MyTemplate1>
... and so on
</local:MyTemplateSelector>
</DataTemplate>

最佳答案

您应该只使用GridStackPanel 仅使用每个元素所需的最小空间。

<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*">
<ColumnDefinition Width="*">
</Grid.ColumnDefinitions>
<TextBlock Text="{Binding DisplayName}" />
<TextBox Text="{Binding Value}" Name="{Binding ID}"/>
</Grid>

关于wpf - ListBox 或 ItemsControl 项目不占用所有可用空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9287530/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com