I have an issue when loading the layout on Raddock. I'm trying to cancel a view loading if the users access has been revoked. However when I do LayoutSerializationCustomLoadingEventArgs.Cancel = true and return from OnCustomElementLoading I get the following error.
System.ArgumentOutOfRangeException
HResult=0x80131502
Message=Specified argument was out of the range of valid values.
Parameter name: elementTypeName
Source=Telerik.Windows.Controls.Docking
StackTrace:
at Telerik.Windows.Controls.Docking.DefaultDockingLayoutFactory.NotifyCustomElementLoading(String elementTypeName, String serializationTag, Dictionary`2 attributes)
at Telerik.Windows.Controls.Docking.DefaultDockingLayoutFactory.ReadPaneXml(XmlReader reader)
at Telerik.Windows.Controls.Docking.DefaultDockingLayoutFactory.LoadPaneGroup(LoadingParentElementArgs args)
at Telerik.Windows.Controls.Docking.DefaultDockingLayoutFactory.LoadSplitContainer(LoadingParentElementArgs args)
at Telerik.Windows.Controls.Docking.DefaultDockingLayoutFactory.LoadDocking(LoadingParentElementArgs args)
at Telerik.Windows.Controls.Docking.DefaultDockingLayoutFactory.LoadLayout(XmlReader reader)
at Telerik.Windows.Controls.RadDocking.LoadLayout(Stream source, Boolean raiseEventsIfNoSerializationTag)
at MyApp.LoadLayout(LoadLayoutEventParameters loadLayoutEventParameters) in..
Here is the code:
public
void
LoadLayout(LoadLayoutEventParameters loadLayoutEventParameters)
{
using
(FileStream layoutFile =
new
FileStream(Path.Combine(
this
.configPath,
this
.layoutFilename), FileMode.Open))
{
radDocking.LoadLayout(layoutFile);
}
}
My views inherit RadPane so I use CustomElementLoading.
this
.radDocking.CustomElementLoading +=
this
.MyApp.OnCustomElementLoading;
public
void
OnCustomElementLoading(
object
sender, Telerik.Windows.Controls.LayoutSerializationCustomLoadingEventArgs e)
{
if
(!userCanAccess)
{
e.Cancel =
true
;
return
;
}
e.SetAffectedElement(MyAppView);
}
Here is my xaml
<
telerik:RadDocking
Grid.Row
=
"2"
x:Name
=
"radDocking"
BorderThickness
=
"0"
HasDocumentHost
=
"False"
>
<
telerik:RadDocking.DockingPanesFactory
>
<
docking:ShellDockingPanesFactory
/>
</
telerik:RadDocking.DockingPanesFactory
>
<
telerik:RadDocking.GeneratedItemsFactory
>
<
docking:CustomDefaultGeneratedItemsFactory
/>
</
telerik:RadDocking.GeneratedItemsFactory
>
<
telerik:RadSplitContainer
Orientation
=
"Vertical"
InitialPosition
=
"DockedLeft"
>
<
telerik:RadPaneGroup
HorizontalAlignment
=
"Left"
x:Name
=
"leftGroup"
telerik:RadDocking.SerializationTag
=
"leftGroup"
/>
</
telerik:RadSplitContainer
>
<
telerik:RadSplitContainer
InitialPosition
=
"DockedRight"
>
<
telerik:RadPaneGroup
HorizontalAlignment
=
"Right"
x:Name
=
"rightGroup"
telerik:RadDocking.SerializationTag
=
"rightGroup"
/>
</
telerik:RadSplitContainer
>
<
telerik:RadSplitContainer
InitialPosition
=
"DockedBottom"
>
<
telerik:RadPaneGroup
x:Name
=
"bottomGroup"
telerik:RadDocking.SerializationTag
=
"bottomGroup"
/>
</
telerik:RadSplitContainer
>
<
telerik:RadSplitContainer
InitialPosition
=
"DockedTop"
>
<
telerik:RadPaneGroup
x:Name
=
"topGroup"
telerik:RadDocking.SerializationTag
=
"topGroup"
/>
</
telerik:RadSplitContainer
>
<
telerik:RadSplitContainer
InitialPosition
=
"FloatingOnly"
>
<
telerik:RadPaneGroup
x:Name
=
"floatingOnlyGroup"
telerik:RadDocking.SerializationTag
=
"floatingOnlyGroup"
/>
</
telerik:RadSplitContainer
>
<
telerik:RadSplitContainer
InitialPosition
=
"FloatingDockable"
>
<
telerik:RadPaneGroup
x:Name
=
"floatingDockableGroup"
telerik:RadDocking.SerializationTag
=
"floatingDockableGroup"
/>
</
telerik:RadSplitContainer
>
</
telerik:RadDocking
>
How can I control which views are loaded from the saved layout at runtime? I think it would get a bit messy if I start parsing the saved layout file and removing views. I usually save the layout when the app closes, this will remove the views the user can no longer access because I'm hoping they won't open in the first place if the access is revoked.