在控件内部,我有一个子控件的通用编号(我只在运行时知道)。 每个子控件都是一个LanguageTextView,它包含Liquid的富文本编辑器。 按钮用于控制如何在父控件中显示这些富文本。 有两个选项:单个LanguageTextView或在父控件内等间隔的所有LanguageTextView项。
为了解决这个问题,我在容器中使用了Grid。 有了代码,我在网格上填充了“加载”事件中的丰富文本:
foreach (OM_Language lang in LanguageDataManager.INSTANCE.ActiveLanguages) {
LanguageTextView tb = new LanguageTextView();
tb.HorizontalAlignment = System.Windows.HorizontalAlignment.Stretch;
tb.HorizontalContentAlignment = System.Windows.HorizontalAlignment.Stretch;
tb.HorizontalAlignment = HorizontalAlignment.Stretch;
tb.HorizontalContentAlignment = HorizontalAlignment.Stretch;
tb.init(lang);
tb.onTextChangedEvent += new LanguageTextView.onTextChangedEventType(tb_onTextChangedEvent);
if ((_module.Texts != null) && (_module.Texts.ContainsKey(lang.OMID.Value))) {
tb.Text = _module.Texts[lang.OMID.Value];
}
_textBoxList.Add(lang.OMID.Value, tb);
}
_textBoxList是一个字典,它传递给网格控制器,并控制网格对象。网格控制器,称为MultiLanguageGridController,处理如何在网格内显示LanguageTextView(单个对象或所有对象在一起)。 作为第一步,在创建时,网格控制器将每列的LanguageTextView放置一个代码:
int count = 0;
foreach (int key in _uiElements.Keys) {
FrameworkElement fe = _uiElements[key];
ColumnDefinition cd = new ColumnDefinition();
cd.Width = new GridLength(1, GridUnitType.Star);
_cds.Add(key, cd);
_grid.ColumnDefinitions.Add(cd);
_grid.Children.Add(fe);
Grid.SetColumn(fe, count);
Grid.SetRow(fe, 0);
count++;
}
要控制布局,有两种方法:showAllObjects和showSingleObjet(objectid)。
showAllObject是这样的:
foreach (int key in _uiElements.Keys) {
_cds[key].Width = new GridLength(1, GridUnitType.Star);
}
showSingleObject如下:
foreach(int key in _uiElements.Keys){
if(key == objectId){
_cds[key].Width = new GridLength(1, GridUnitType.Star);
}else{
_cds[key].Width = new GridLength(0);
}
}
按下控制按钮时,按钮事件将以这种方式处理:
ModuleListItemData mld = this.DataContext as ModuleListItemData;
if (mld == null) {
return;
}
mld.IsShowAllLanguages = !mld.IsShowAllLanguages;
IsShowAllLanguages是一个触发属性更改事件的属性。 财产变更事件被截获并以这种方式处理:
if ("IsShowAllLanguages".Equals(e.PropertyName)) {
if (tmd.IsShowSingleLanguage) {
_gridCtrl.showSingleObject(tmd.SelectedLanguage.OMID.Value);
} else {
_gridCtrl.showAllObjects();
}
return;
}
其中_gridCtrl是对MultiLanguageGridController的引用。
按钮事件处理第二次往返后,应用程序崩溃。 调试应用程序,我在按钮clich事件处理程序的最后一行设置了一个断点,如下所示:
private void _btnShowAllLang_Click(object sender, RoutedEventArgs e) {
ModuleListItemData mld = this.DataContext as ModuleListItemData;
if (mld == null) {
return;
}
====> mld.IsShowAllLanguages = !mld.IsShowAllLanguages; <=== Break point here
}
每次按下控制按钮时,都会到达断点,但是在退出方法按F10(visual studio 2010)后,应用程序停止并在我获得异常后停止:
System.Windows.dll中发生了未处理的“System.AccessViolationException”类型异常。试图读取受保护的内存。
我无法在事件处理程序方法之外进行调试! 任何想法??
提前感谢您的支持。
答案 0 :(得分:0)
奇怪但真实,解决方案是改变XAML包含:
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:controlsToolkit="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Toolkit"
xmlns:myConverters="clr-namespace:ArgoWeb.Utility.Data"
mc:Ignorable="d"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
d:DesignWidth="608" d:DesignHeight="112"
为:
xmlns:my="clr-namespace:ArgoWeb.UI.UserControls.ModuleView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:local="clr-namespace:ArgoWeb.Utility.Data"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
mc:Ignorable="d"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
d:DesignWidth="482" d:DesignHeight="144" Height="100"
这解决了这个问题。