|
Hi,
I want to do some processing after knowing that a control has finished rendering. In windows forms we usually had events like OnRenderComplete with all the controls. But in WPF I found events like Loaded, Initialized, OnLayoutUpdated etc.. which do not inform you that the control has actually finished rendering on the UI.
Is there a way to identify this?
Pankaj Chamria,
Software Developer.
|
|
|
|
|
Next problem....
Here's some code
<DataTemplate x:Key="TestDataListTemplate">
<Border Margin="5" BorderThickness="1" BorderBrush="Black" CornerRadius="4">
<Grid Margin="5,2">
<Grid.RowDefinitions>
<RowDefinition></RowDefinition>
<RowDefinition></RowDefinition>
</Grid.RowDefinitions>
<TextBlock Grid.Row="0" Text="{Binding Path=Usage}" Foreground="Black" FontWeight="Bold" FontFamily="Courier" FontSize="12"></TextBlock>
<TextBlock Grid.Row="1" FontFamily="Arial" Foreground="DarkBlue" Text="{Binding Path=Path, UpdateSourceTrigger=PropertyChanged}" FontSize="12"></TextBlock>
</Grid>
</Border>
</DataTemplate>
...which I use as a ListBoxItem.
If I want a context menu for each item like this, I manage to get the menu, editing the code to...
...<Grid Margin="5,2">
<Grid.ContextMenu>
<ContextMenu>
<MenuItem Header="Delete" />
</ContextMenu>
</Grid.ContextMenu>...
But how do I implement the click event???
|
|
|
|
|
mikla521 wrote: But how do I implement the click event???
Which click event?
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
Sorry....like this then...
<DataTemplate x:Key="TestDataListTemplate" >
...
<Grid Margin="5,2">
<Grid.ContextMenu>
<ContextMenu>
<MenuItem Header="Delete" Click="MenuItem_Click_DeleteProduct" />
</ContextMenu>
</Grid.ContextMenu>...
Error:ResourceDictionary root element requires a x:Class attribute...
If I add x:class="MyProgram.Window1" to <ResourceDictionary the i get this instead, among a few others...
Error: Partial declarations of MyProgram.Window1 must not specify different base classes....don't get it.
Well, it seems like I have more problems. The goal is to have ListBox with DataTemplate items, then I want a ContextMenu where I can choose to delete an item... Maybe I have to think in another way.
modified on Sunday, April 12, 2009 2:41 AM
|
|
|
|
|
Where is this DataTemplate resource located?
It looks like there's no problem with the template but there's a problem with where
the template an/or the click handler code is located...
Mark
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
I have created a separate file with my templates and style and use <ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="resourceDic.xaml"/>
</ResourceDictionary.MergedDictionaries>
|
|
|
|
|
You'll need an x:class set on your resource dictionary that references the
class containing the click handler.
For example:
<!-- Dictionary1.xaml -->
<ResourceDictionary
x:Class="WPFTester.DictionaryHandlerClass"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WPFTester">
<DataTemplate x:Key="TestDataListTemplate" DataType="{x:Type local:Item}">
<Border BorderBrush="SteelBlue" BorderThickness="4" >
<Grid Background="LightSteelBlue" Height="20" >
<Grid.ContextMenu>
<ContextMenu>
<MenuItem Header="Delete" Click="MenuItem_Click" />
</ContextMenu>
</Grid.ContextMenu>
</Grid>
</Border>
</DataTemplate>
</ResourceDictionary>
using System;
using System.Windows;
namespace WPFTester
{
public partial class DictionaryHandlerClass
{
private void MenuItem_Click(object sender, RoutedEventArgs e)
{
}
}
}
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
Ok, thanks
I tried that before but it doesn't seems like it's possible to use the startup Window1 class. Think I have to create a separate class behind my resource file and go from there...
|
|
|
|
|
mikla521 wrote: it doesn't seems like it's possible to use the startup Window1 class
Yes. ResourceDictionary is a different class than Window
Mark
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
I've recently decided to look into adding the ability to load WPF Windows to one of my pet projects. I also want to allow it to process speech, and other goodies. To achieve this, I've created a new class in my 'host' Windows Forms application, which inherits from System.Windows.Window. The requirements for a Window to be loaded are:
- It must have an attribute which contains the name, category, etc.
- It must inherit from my custom class
I have no problem with the first one, but the second one is where I fall down. I have added a reference to the 'host' application in the 'parasite' (sorry, don't know how else to describe it) application, and changed the C# back-end class to inherit from my custom class. When I try to build, I get this error
Partial declarations of 'SampleWPFMiniApp.wndMain' must not specify different base classes
I presume the designer is similar to that of Windows Forms in that the code is split between XAML and code. How would I specify the correct base class in XAML? For what it's worth, the base class I specified in my C# code is Host.ShellComponents.ParasiteWindow
|
|
|
|
|
There's no need to worry about my original post. By adding xmlns:src="clr-namespace:Host.ShellComponents.ParasiteWindow;assembly=Host" along with the other xmlns XAML, and then setting the root element to src:ParasiteWindow , I can compile successfully. But now I have another problem. How do I host a WPF Window (or equivalent) in a Windows Form? I've been trying to use the System.Windows.Interop.WindowInteropHelper class, and this shows the Window, but not as a child of the Windows Forms host
|
|
|
|
|
I have the following style:
<Style TargetType="{x:Type Image}" >
<Style.Triggers>
<DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType={x:Type Button},
AncestorLevel=1}, Path=IsEnabled}" Value="False">
<Setter Property="Opacity" Value="0.40" />
</DataTrigger>
</Style.Triggers>
</Style>
Where do I put it if I want it to be global to the application, and how do I get to it once it's there?
"Why don't you tie a kerosene-soaked rag around your ankles so the ants won't climb up and eat your candy ass..." - Dale Earnhardt, 1997 ----- "...the staggering layers of obscenity in your statement make it a work of art on so many levels." - Jason Jystad, 10/26/2001
|
|
|
|
|
|
I tried that and it kept telling me something about content already having been defined. BTW, I was trying to put it inside the Application.Resources element.
"Why don't you tie a kerosene-soaked rag around your ankles so the ants won't climb up and eat your candy ass..." - Dale Earnhardt, 1997 ----- "...the staggering layers of obscenity in your statement make it a work of art on so many levels." - Jason Jystad, 10/26/2001
|
|
|
|
|
Currently the way you have it defined
<style targettype="{x:Type Image}"></style>
this assigns this style to all of the image types within the scope. If you have this definition elsewhere (Window.Resources or elsewhere) you could have a conflict. If you want to have it only affect a select few controls you can add a key to it reference it on the controls you want it to be used on.
Have you looked at WPF Themes project? http://http://www.codeplex.com/wpfthemes[^] I believe they are doing something similar to what you want.
Richard
|
|
|
|
|
You can find a description of the resource lookup behavior here:
WPF: Resources Overview[^]
That may help you coose the most appropriate place.
Mark
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
I've already been there and it was no help.
"Why don't you tie a kerosene-soaked rag around your ankles so the ants won't climb up and eat your candy ass..." - Dale Earnhardt, 1997 ----- "...the staggering layers of obscenity in your statement make it a work of art on so many levels." - Jason Jystad, 10/26/2001
|
|
|
|
|
John Simmons / outlaw programmer wrote: global to the application
If I have a style or template that I want to be global I use a MergedDictionary, for example.
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="Dictionaries\Styles.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
John Simmons / outlaw programmer wrote: how do I get to it once it's there
You would access the style/template using the key you define for it.
Resource dictionary:
<ControlTemplate x:Key="NormalButtonTemplate" TargetType="{x:Type Button}">
snip...
</ControlTemplate>
Then in your xaml you would assign it using the key in this case:
<Button Template="{DynamicResource NormalButtonTemplate}" />
Hope that helps
Why is common sense not common?
Never argue with an idiot. They will drag you down to their level where they are an expert.
Sometimes it takes a lot of work to be lazy
Individuality is fine, as long as we do it together - F. Burns
Help humanity, join the CodeProject grid computing team here
|
|
|
|
|
It is possible to put your Style in the App.xaml with the <application.resources> and that will put your style at the application level and in order to access it you can Style="{StaticResource (Name Here)}" and that will get your Style from the application resources.
|
|
|
|
|
You could also put these in a separate Style dll altogether ...
|
|
|
|
|
Consider the following code:
<Canvas Panel.ZIndex="999" HorizontalAlignment="Left" Width="225" Height="262" VerticalAlignment="Top">
<Expander Margin="-13,-47,0,-210" Name="expander1" Background="Transparent" HorizontalAlignment="Left"
Width="221" Height="257" Canvas.Top="48" Canvas.Left="14">
<Expander.Header>
<Rectangle Height="26" Margin="22,-21,0,0" Name="rectangle1"
Stroke="OrangeRed" VerticalAlignment="Top" RadiusX="8" RadiusY="8" Fill="DarkBlue" />
<Label Margin="22,-20,0,0" Background="Transparent" Foreground="White" Name="label99"
FontFamily="Arial" FontSize="14" FontWeight="Bold" FontStyle="Italic"
HorizontalContentAlignment="Center"
Content="BTN:123-456-7890" Height="26" VerticalAlignment="Top" />
</Expander.Header>
<Grid >
<Grid.BitmapEffect>
<DropShadowBitmapEffect />
</Grid.BitmapEffect>
<telerik:RadTreeView blah blah blah />
</Grid>
</Expander>
</Canvas>
The designer is giving the following error:
The property "Header" is set more than once.
I don't understand why I'm getting this error - there's only one header specification in the control.
"Why don't you tie a kerosene-soaked rag around your ankles so the ants won't climb up and eat your candy ass..." - Dale Earnhardt, 1997 ----- "...the staggering layers of obscenity in your statement make it a work of art on so many levels." - Jason Jystad, 10/26/2001
|
|
|
|
|
I'm not an expert at all but in this case you just can't use several controls inside the header.
Instead you can use a Grid or Stackpanel or similar and there put your Rectangle and Label.
|
|
|
|
|
It is because you are trying to add two elements the Rectangle and Label. You can put both inside a grid or other kind of panel or maybe you could put the label inside a border and not need the Rectangle.
|
|
|
|
|
Expander.Header is an object not a collection. You can't put both a rectangle and a label in it. Put only one object.
Eslam Afifi
|
|
|
|
|
I have one MFC control,which one i create, and I convert this as a .dll file and add a System::Windows::Forms::UserControl to this dll and whit the help of this Usercontrol I can load this control in WinForm application.
I need to use this control in WPF application, with out using the System::Windows::Forms, So, i think, I need to add a System::Window::Controls::UserControl to the dll and convert this as a UIElement^. But I have no idea how to do this. If you have some idea, or any help pages in internet, how to create a System::Window::Controls::UserControl from a MFC dll please help me.
|
|
|
|