我正在尝试为办公室员工创建一个日程安排应用程序。所有有关 Time In 和 Time Out 的信息都将使用我正在尝试构建的界面来填充。这给我们带来了手头的问题。我有一个 DataTemplate,我将其用作 Reuseable ContentControl 的一部分。我创建了这些控件的列表并将它们添加到 StackPanel。最后,我将该堆栈面板放入另一个堆栈面板。我的问题是我无法聚焦或选择三个深度的文本框。有时我可以选择第一个内容控件的第一个 TextBox,然后我可以 TAB 到下一个 TextBox。但我不能直接选择第二个或第一个文本框之后的任何文本框。甚至第一个文本框也感觉有一半被阻止了,因为我必须单击其中心的左侧才能选择它。
我尝试将内容控件直接添加到 RootLayout 中,它可以工作。我还尝试通过将 ContentControl 直接添加到第一个堆栈面板(我的主窗口中的那个)中来删除第二层堆栈面板,它也可以工作(我认为)。
有什么想法吗?如果你们需要更多信息或代码的更多细节,请告诉我。
这是数据模板:
<DataTemplate x:Key="scheach">
<Grid Width="94" Background="#FF575A5E" HorizontalAlignment="Left" Height="58" VerticalAlignment="Top" MouseDown="Grid_MouseDown">
<Grid.RowDefinitions>
<RowDefinition Height="0.489*"/>
<RowDefinition Height="0.511*"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="0.514*"/>
<ColumnDefinition Width="0.486*"/>
</Grid.ColumnDefinitions>
<TextBox Margin="3,2,2.299,0" TextWrapping="Wrap" Text="{Binding ATimeIn}" FontSize="13.333" BorderBrush="#FF1A2FE0" Height="24" VerticalAlignment="Top" HorizontalAlignment="Stretch" Width="Auto" IsEnabled="False"/>
<TextBox Margin="0.701,2,0,0" TextWrapping="Wrap" Text="{Binding ATimeOut}" FontSize="13.333" BorderBrush="#FF1A2FE0" Width="43" HorizontalAlignment="Left" d:LayoutOverrides="Width" Height="24" VerticalAlignment="Top" IsEnabled="False" Grid.Column="1"/>
<TextBox Margin="3,2.053,2.299,2.204" Grid.Row="1" TextWrapping="Wrap" Text="TextBox"/>
<TextBox Margin="0.701,2.053,1.983,2.204" Grid.Row="1" TextWrapping="Wrap" Text="TextBox" Grid.Column="1"/>
</Grid>
</DataTemplate>
下面是创建内容控件的代码:
public ContentControl GetEachInAndOut(EachSch sch,DateTime date)
{
ContentControl cont = new ContentControl();
cont.DataContext = sch;
cont.ContentTemplate = (DataTemplate)win.FindResource("scheach");
return cont;
}
将此内容控件添加到堆栈面板的代码:
//function called for each user
public StackPanel GetWeek(DateTime start, DateTime end)
{
StackPanel stack = new StackPanel();
stack.Orientation = Orientation.Horizontal;
stack.Width = win.Width - 30;
stack.Margin = new Thickness(2);
while (true)
{
EachSch each = new EachSch();
stack.Children.Add(GetEachInAndOut(each, temp));
temp = temp.AddDays(1);
if (temp == end.AddDays(1))
break;
}
return stack;
}
}
主窗口中的最终代码:
this.stackPanel1.Children.Add(master.GetWeek(DateTime.Now, DateTime.Now.AddDays(6)));
上面的函数在每个用户上调用,最后我有 1+ 个堆栈面板;我将这些添加到正在我的窗口中显示的另一个堆栈面板。
2012 年 4 月 22 日更新:仍然没有运气。我尝试在堆栈面板中创建多个 ItemsControl 而不是 ContentControls。我将该 ItemsControl 添加到我窗口中的包装面板中。现在我可以单击每个列表框的前两项,但所有其他项仍然不可单击且不可编辑。
2012 年 4 月 22 日下午 6:12 更新:计划 Q;我正在尝试使用以下模板解决我的问题。似乎实现了我的目标,我可以更改和编辑文本框,但我最初遇到的问题仍然存在。关于这个问题,我将其更改ContentControl
为UserControl
但没有运气。我终于在 Windows.Forms 应用程序中创建了一个用户控件,并使用 WindowsFormHost 导入到 WPF 中。它有效,但是..不...我不想走那条路。
<ListBox Height="271" HorizontalAlignment="Left" Margin="12,47,0,0" Name="listBox1" VerticalAlignment="Top" Width="814" >
<ListBox.ItemTemplate>
<DataTemplate>
<Grid>
<TextBlock Text="{Binding Barcode}" />
<ItemsControl ItemTemplate="{StaticResource scheach}" ItemsPanel="{StaticResource paneltemp}" ItemsSource="{Binding Days}">
</ItemsControl>
</Grid>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>