有没有办法让tabcontrol采取最大标签项的大小(实际上,tabitem的内容)?
由于tabcontrol没有指定特定的大小,因此它应该自动调整大小:它可以正确地执行此操作,但是当您切换选项卡时,它会自动将其自身调整为当前所选选项卡内容的高度(和宽度).
我不希望调整大小发生,让tabcontrol假设最大项目的高度,但仍然让它自动调整大小.
有线索吗?我尝试数据绑定到Height使用多绑定作为内容的每个元素ActualHeight的Items属性,并对Tabcontrol 的属性和属性进行绑定.但是,唉,ActualHeight内容元素总是0.
<TabItem Header="Core" >
<Grid Margin="5">
<Grid.Height>
<MultiBinding Converter="{Converters1:AllTabContentEqualHeightConverter}">
<Binding Path="ActualHeight" RelativeSource="{RelativeSource Mode=FindAncestor, AncestorType={x:Type TabControl}}"/>
<Binding Path="Items" RelativeSource="{RelativeSource Mode=FindAncestor, AncestorType={x:Type TabControl}}"/>
</MultiBinding>
</Grid.Height>
...
Run Code Online (Sandbox Code Playgroud)
可以这样做吗?
我需要处理多个面板,包含各种数据掩码.使用TreeView控件可以看到每个面板.
此时,我手动处理面板可见性,方法是将所选面板可见并将其置于顶部.
实际上这并不是很容易,特别是在UI设计师中,因为当我添加一个全新的面板时,我必须调整每个面板的大小,然后设计它......
一个好的解决方案是使用TabControl,每个面板都包含在TabPage中.但是我找不到任何隐藏TabControl按钮的方法,因为我已经有了一个用于选择项目的TreeView.
另一种解决方案是ipotethic"StackPanelControl",其中Panel使用堆栈排列,但我无法在任何地方找到它.
处理这种UI的最佳解决方案是什么?
我正在尝试我的第一个Windows Form项目,以前完全基于Web,并遇到一些问题.我想将一个对象列表绑定到TabControl并创建Tabs,然后从每个选项卡的click事件中访问数据绑定值.
我想要绑定的对象是
public class TreeNodeItem
{
private NTree<string> node;
public TreeNodeItem(NTree<string> node)
{
this.node = node;
}
public string Value
{
get { return this.node.data; }
}
}
Run Code Online (Sandbox Code Playgroud)
NTree节点表示对象中的节点,该节点对树结构中的数据进行建模.我想为列表中的每个对象创建一个选项卡,其Value属性绑定到Tab Text属性.其他帖子提到绑定到控件的ItemsSource属性,但Visual Studio没有给我这个属性.
任何帮助将不胜感激.
干杯
斯图尔特
有人知道如何在WinForms应用程序中单击WebBrowser控件中的链接,然后在我的TabControl中的新选项卡中打开该链接吗?
我已经搜索了几个月,看过很多教程/文章/代码示例,但似乎没有人曾经在C#中尝试过这个.
任何建议/样品都非常感谢.
谢谢.
是否有一种简单的方法可以在WPF中的标题页的内部和右侧定位另一个控件(即按钮)?
在网络中,我会使用浮点或绝对定位来完成此任务.
这张照片中的红线是我想要的: WPF标签旁边的控件http://www.jonkragh.com/images/text-next-to-tabs.png
谢谢!乔恩
我有一个TextBox实现的对象的属性绑定IDataErrorInfo.我成立Validation.ErrorTemplate的TextBox,并能正常工作.问题是我在a上有这些TabControl,如果我将标签更改为另一个标签然后返回到初始标签(其中TextBox),则验证模板不再显示.它看起来像是经过验证的(就像值是正确的),但实际上并非如此.
这是IDataErrorInfo对象 - 请注意,"正确"值是一个长度为2的字符串:
public class Presenter : IDataErrorInfo
{
public Presenter()
{
this.Property = String.Empty;
}
public string Property { get; set; }
public string Error { get { return null; } }
public string this[string columnName]
{
get
{
if (columnName == "Property")
{
if (this.Property.Length == 2)
return null;
else
return "Invalid property length!";
}
else return null;
}
}
}
Run Code Online (Sandbox Code Playgroud)
这是XAML:
<TabControl …Run Code Online (Sandbox Code Playgroud) 我必须开发一个自定义的选项卡控件,并决定用WPF/XAML创建它,因为无论如何我打算学习它.它完成时应该看起来像这样:

到目前为止我取得了很好的进展,但还有两个问题:
只有第一个/最后一个标签项应该有一个圆角的左上角/左下角.是否可以修改这些项目的样式,类似于我对所选标签项的方式?
选定的选项卡项右侧不应有边框.我试图用z-index和重叠来完成这个,但结果相当令人失望.有没有其他方法可以做到这一点?

XAML:
<Window x:Class="MyProject.TestWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="TestWindow" Height="350" Width="500" Margin="5" Background="LightGray">
<Window.Resources>
<LinearGradientBrush x:Key="SelectedBorderBrush" StartPoint="0,0" EndPoint="1,0">
<GradientBrush.GradientStops>
<GradientStopCollection>
<GradientStop Color="Gray" Offset="0.965"/>
<GradientStop Color="WhiteSmoke" Offset="1.0"/>
</GradientStopCollection>
</GradientBrush.GradientStops>
</LinearGradientBrush>
<Style TargetType="{x:Type TabControl}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type TabControl}">
<DockPanel>
<Border
Panel.ZIndex="50"
Margin="0,100,-1,0"
Background="#FFAAAAAA"
BorderBrush="Gray"
CornerRadius="7,0,0,7"
BorderThickness="1">
<TabPanel
Margin="0,0,0,0"
IsItemsHost="True" />
</Border>
<Border
Background="WhiteSmoke"
BorderBrush="Gray"
BorderThickness="1"
CornerRadius="7,7,7,0" >
<ContentPresenter
ContentSource="SelectedContent" />
</Border>
</DockPanel>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<Style TargetType="{x:Type TabItem}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type TabItem}">
<Grid>
<Border Name="Border"
Background="#FFAAAAAA" …Run Code Online (Sandbox Code Playgroud) 我有一个带TabControl的用户界面,最初显示一个起始页面.可以通过双击(例如,DataGrid)中的内容将其他项添加到其中.创建新选项卡时应选择它们.如果与网格中的项目对应的文档已打开,则应打开该文档的现有选项卡,而不是创建新文档.
我知道我应该能够通过设置TabControl的SelectedItem或SelectedIndex属性以编程方式选择选项卡.但是,所需的选项卡实际上从未激活.如果我设置了一个,然后在调试器中检查TabControl的状态,那么两个字段似乎都正确更新.但是,在我继续执行之后,我看到选定的选项卡在UI中保持不变,如果我暂停并再次检查TabControl的状态,我会看到SelectedItem和SelectedIndex已经返回到之前的值.另一方面,通过在UI中单击选项卡来选择选项卡可以正常工作.
这是TabControl的声明:
<TabControl x:Name="Tabs" >
<TabItem x:Name="StartPageTab" Header="Start Page" DataContext="{Binding Path=StartPageViewModel}">
...
</TabItem>
</TabControl>
Run Code Online (Sandbox Code Playgroud)
以及添加和选择标签的代码:
private void _SelectTab(MyViewModel model)
{
TabItem tab;
if (_TryFindTab(model, out tab)) Tabs.SelectedItem = tab;
}
private bool _TryFindTab(MyViewModel target, out TabItem tab)
{
foreach (TabItem item in Tabs.Items)
{
MyViewModel model = item.DataContext as MyViewModel;
if (model != null && model.Equals(target))
{
tab = item;
return true;
}
}
tab = null;
return false;
}
private void _AddTab(MyViewModel model)
{
TabItem tab = new …Run Code Online (Sandbox Code Playgroud) 我需要一些方法来隐藏TabControl的标题(我将以编程方式切换选定的选项卡).我怎样才能做到这一点?
我很确定这已经在某个地方得到了解答,但我似乎无法在我的生活中找到它.
我正在尝试使用TabControl在UserControls之间切换(每个选项卡都不同,因此不使用Items)
这是细分:我有我的主视图和3个用户控件.Mainview有一个选项卡控件 - 每个选项卡应显示不同的用户控件.
我可以很容易地将tabcontrol对象设置为usercontrol但是它没有绑定到viewmodel,只绑定了视图.
所以我在我的VM中使用Conductor,以及ActivateItem.这是它开始变得奇怪/令人沮丧的地方.应用程序从选中Tab0开始,但Tab2(最后一个选项卡)内容.单击任何其他选项卡,为该选项卡加载正确的ViewModel.单击返回Tab0,同时加载正确的内容.
我如何让它停下来?另外,如果切换标签没有再次重新初始化视图模型,清除已经输入的字段,我真的很喜欢它.
无论如何,这是我的一些消息来源,我打算将它放在这里并在我打破鼠标之前处理其他事情.
视图:
<TabControl HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Grid.Row ="1">
<TabItem Header="PC Information">
<Grid>
<ContentControl x:Name="LoadRemoteInfo" cal:View.Model="{Binding ActiveItem}"/>
</Grid>
</TabItem>
<TabItem Header="Remote Tools">
<Grid>
<ContentControl x:Name="LoadRemoteTools" cal:View.Model="{Binding ActiveItem}"/>
</Grid>
</TabItem>
<TabItem Header="CHRemote">
<Grid>
<ContentControl x:Name="LoadCHRemote" cal:View.Model="{Binding ActiveItem}"/>
</Grid>
</TabItem>
</TabControl>
Run Code Online (Sandbox Code Playgroud)
和ViewModel:
class MainViewModel : Conductor<object>
{
RemoteInfoViewModel remoteInfo = new RemoteInfoViewModel();
RemoteToolsViewModel remoteTools = new RemoteToolsViewModel();
CHRemoteViewModel chRemote = new CHRemoteViewModel();
public MainViewModel()
{
ActivateItem(remoteInfo);
}
public void LoadRemoteInfo()
{
ActivateItem(remoteInfo);
}
public void LoadRemoteTools() …Run Code Online (Sandbox Code Playgroud) tabcontrol ×10
c# ×6
wpf ×6
winforms ×4
.net ×1
height ×1
multibinding ×1
mvvm ×1
stackpanel ×1
validation ×1
xaml ×1