这是情况......在顶层,我有一个TabControl.TabControl中的每个页面都包含一个ListBox:
<TabControl>
<TabItem Header="item 1">
<ListBox>
<ListBoxItem>sub item 1</ListBoxItem>
<ListBoxItem>sub item 2</ListBoxItem>
<ListBoxItem>sub item 3</ListBoxItem>
</ListBox>
</TabItem>
<TabItem Header="item 2">
<ListBox>
<ListBoxItem>sub item 1</ListBoxItem>
<ListBoxItem>sub item 2</ListBoxItem>
</ListBox>
</TabItem>
</TabControl>
Run Code Online (Sandbox Code Playgroud)
ListBoxes有一个水平方向的StackPanel作为它们的ListTemplate:
<Style TargetType="ListBox">
<Setter Property="ItemsPanel">
<Setter.Value>
<ItemsPanelTemplate>
<StackPanel Orientation="Horizontal"
VisibleChanged="onStackPanelVisibilityChange"
Loaded="onStackPanelLoaded"
VerticalAlignment="Center" HorizontalAlignment="Center" />
</ItemsPanelTemplate>
</Setter.Value>
</Setter>
</Style>
Run Code Online (Sandbox Code Playgroud)
您会注意到我在堆栈面板上有一些事件处理程序.这些是为堆栈面板中的项目设置动画,因此它们会依次淡入视图.事件处理程序实现为:
void onStackPanelLoaded(object sender, RoutedEventArgs e)
{
StackPanel panel = sender as StackPanel;
applySubItemAnimations(panel);
}
void onStackPanelVisibilityChange(object sender, DependencyPropertyChangedEventArgs e)
{
StackPanel panel = sender as StackPanel;
if (panel.IsVisible)
{
applySubItemAnimations(panel);
} …Run Code Online (Sandbox Code Playgroud) 我有使用C#编写的Winform应用程序.在我的表单上,我有一个带有七个页面的TabControl,每个页面都有元素(主要是TextBoxes和DropDownLists).我使用DataReader提取一些信息,填充DataTable,并使用元素的DataBindings.Add方法用当前值填充这些元素.
用户可以在这些元素中输入数据,按"保存",然后使用元素的文本字段设置UPDATE查询的参数.例如:
updateCommand.Parameters.Add("@CustomerName", SqlDbType.VarChar, 100).Value = CustomerName.Text;
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是,一旦我加载表单,所有元素显然都是空的,直到我手动选择每个选项卡.因此,如果我在加载表单时立即按"保存",我尚未选择的TabPages上的所有字段都尝试使用空数据更新(不好).当我选择每个TabPage时,这些元素现在将正确地发送它们的数据.目前,我已经制定了一个(非常)丑陋的解决方法,我在第一次填充数据时以编程方式选择每个TabPage,但这是一个不可接受的长期解决方案.
我的问题是,在用户选择TabPage之前,如何让TabPages上的所有元素正确返回数据?
当然这得要容易; 我只是没有运气.
我该如何获得TabPage给定的TabControl,其标签包含给定Point?例如,如果我正在处理MouseUp事件,并且我想知道鼠标在发布时哪个选项卡已经结束.
我试过GetChildAtPoint,但似乎总是返回第一个标签(除非我使用它错了).
大家好我想问:如何以程序方式添加标签.
对于我的问题我有一个选项卡控件,默认只有一个选项卡.当我点击该按钮将添加另一个选项卡时,我有一个按钮.所以将是两个标签.
请帮我使用c#和xaml.
我们正在动态配置Crystal报表,当我们在单独的窗口中显示它或将报表动态添加到C#WPF StackPanel时,一切正常.
但是当我们尝试将它们作为TabItems添加到TabControl时,我们从PresentationFramework中得到一个例外:
e.Message ="指定索引超出范围或索引处的子项为null.如果VisualChildrenCount返回零,则不调用此方法,表示Visual没有子项.\ r \n参数名称:index\r \n实际值为0 ".
如何避免这种崩溃,以便我们可以在TabControl中获得水晶报告?
我有一个TabControl有两个项目.
<TabControl x:Name="tab" SelectionChanged="TabControl_SelectionChanged">
<TabItem Header="TabItem1">
<Grid />
</TabItem>
<TabItem Header="TabItem2">
<Grid />
</TabItem>
</TabControl>
private void TabControl_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
Debug.WriteLine("Selected Index: " + tab.SelectedIndex);
if (tab.SelectedIndex == 1)
{
tab.SelectedIndex = 0;
}
}
Run Code Online (Sandbox Code Playgroud)
点击第2项时,第1项有焦点并在下面打印.
Selected Index: 1
Selected Index: 0
Run Code Online (Sandbox Code Playgroud)
但重试点击第二项,没有输出!SelectionChanged事件不会触发.
怎么了?有工作吗?
我使用以下方法检查是否单击了选项卡:
tabHost.setOnTabChangedListener(new OnTabChangeListener() {
public void onTabChanged(String tabId) {
int i = tabHost.getCurrentTab();
if (i == 2) {
Log.i("Tab Number", "=" + i);
testFields(); // Verifies that the data fields were filled.
}
}
});
Run Code Online (Sandbox Code Playgroud)
当我检查字段是否正确时,我有一个测试"if or else".
如果一切都完成了,好的!
如果没有,则无法关注下一个标签.必须保持标签"数据"才能完成填充.
如何阻止标签中的更改?一切都正确吗?
编辑以显示测试帮助
final TabHost tabHost = (TabHost) getParent().findViewById(
android.R.id.tabhost);
// ONCLICK TABHOST
for (int i = 0; i < tabHost.getTabWidget().getTabCount(); i++) {
tabHost.getChildAt(i).setOnTouchListener(new OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
int action = event.getAction();
if (action == MotionEvent.ACTION_UP) …Run Code Online (Sandbox Code Playgroud) 我试图让头部的的选择的项目在我的模板TabControl的,但我不能这样做.我尝试了几种解决方案但没有一种方法可行:
没有结果 :
<ContentPresenter ContentSource="{TemplateBinding SelectedItem}"/>
Run Code Online (Sandbox Code Playgroud)
编译错误(因为SelectedItem的类型是对象,而不是HeaderedContentControl):
<ContentPresenter ContentSource="{TemplateBinding SelectedItem.Header}"/>
Run Code Online (Sandbox Code Playgroud)
在C#中很容易得到它,但我想把它放在我的TabControl模板中.
有人有什么想法吗?
谢谢
我有几个标签页集合.默认情况下,当用户打开应用程序时,第一个标签页是开始标签页,然后用户将关闭标签页.现在我想创建一种情况,当用户转到菜单条时,单击"标签页1按钮",然后"标签页1"将出现在标签控件中.任何专业知识都可以帮助我...
我是WPF的初学者,我在编码时需要做很多学习,所以请耐心等待.我搜索了档案,但找不到符合我问题的答案.
我目前有一个包含选项卡控件的视图,该控件最初加载了2个默认选项卡,然后根据用户操作以编程方式添加和删除其他选项卡.
我这样做的方法是为我可以添加和删除的不同类型的视图提供一个可观察的ViewModel集合.
在我的Xaml视图中,我有一些不同的DataTemplate,用于确定要加载的视图类型.
我面临的问题是当我从一个标签点击另一个标签时,我看到一个滞后 - 接近一秒.我在视图后面的代码中加了一个断点,并注意到InitializeComponent()每次单击该选项卡时都会调用该方法.
调用ViewModels的集合ActiveContents,它包含类型的项ActiveContent.ActiveContent该类是我创建的类,它包含一个名为的对象ContentItem,它将保存ViewModel.
以下是我项目中的一些代码:
来自xaml的数据模板之一:
<UserControl.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
.
.
.
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
<DataTemplate DataType="{x:Type viewmodels:InstallQueueViewModel}">
<local:InstallQueueView DataContext="{Binding Path=DataContext.InstallQueueVM,
RelativeSource={RelativeSource AncestorType={x:Type UserControl}}}" />
</DataTemplate>
.
.
.
<DataTemplate x:Key="DataTemplateTabControlContent">
<ContentControl Content="{Binding ContentItem}"></ContentControl>
</DataTemplate>
</UserControl.Resources>
<Grid>
<TabControl ItemsSource="{Binding ActiveContents}"
SelectedIndex="{Binding SelectedTab, Mode=TwoWay}"
IsSynchronizedWithCurrentItem="True"
ItemContainerStyle="{DynamicResource TabItemContainerStyleSpacedMedium}"
ItemTemplate="{StaticResource DataTemplateTabControlHeader}"
ContentTemplate="{StaticResource DataTemplateTabControlContent}">
</TabControl>
Run Code Online (Sandbox Code Playgroud)
有没有办法阻止它每次都加载一个新的视图实例?就像我说的,这是我的第一次,所以我完全有可能以错误的方式解决这个问题 - 如果我要改变我的做法,请告诉我.
我想我应该提到的一件事是,我正在使用MahApps来获得应用程序的Metro感觉.我不确定这对我所看到的滞后是否有贡献.
我主要在切换到包含a的视图时看到滞后DataGrid.我正在考虑将其更改为a,ListView因为数据是只读的,我希望这会给我一些改进,但根本原因仍然没有得到解决.
任何帮助将不胜感激.