I started to love Visual Studio 2013
I started to use Visual Studio 2013 for some new projects. I found there are a number of new features make our life easier, such as displaying the number of references for each class and method.
Those small features help us to build the applications easier.
WPF Animation
I built a feature to have an animation on the wide of a panel and the user click the minimize button. I wish to create a shrinking effect.
The best way I found is using DoubleAnimationUsingKeyFrames. This kind of animation can targeting any properties which is using a double as its value, such as Wide. Finally, I put the into a storyboard. Like the following
Code
DoubleAnimationUsingKeyFrames da = new DoubleAnimationUsingKeyFrames(); | |
LinearDoubleKeyFrame ad3 = new LinearDoubleKeyFrame(); | |
ad3.KeyTime = KeyTime.FromTimeSpan(new TimeSpan(0, 0, 0)); | |
ad3.Value = ActualWidth; | |
LinearDoubleKeyFrame ad = new LinearDoubleKeyFrame(); | |
ad.KeyTime = KeyTime.FromTimeSpan(new TimeSpan(0,0,6)); | |
ad.Value = 0; | |
Storyboard strbStoryboard = new Storyboard(); | |
strbStoryboard.Children.Add(da); | |
Storyboard.SetTargetProperty(da, new PropertyPath("(FrameworkElement.Width)")); | |
Storyboard.Begin(this); |
The example is from my opensource project, advgen contact manager
WPF:Show and Hide Button
In Winform, to show and hide button is easy. There is a property calls visible in Button class. You just need to set it to be True and Hide. That is a simple bool type. In WPF, that is simple too, but that is not a simple bool type. That is Visibility Type.
You just need to do that:
Show:
Code
btnMax.Visibility= System.Windows.Visibility.Visible; |
Hide:
Code
btnMax.Visibility= System.Windows.Visibility.Hidden; |
WPF: How to access a control in style
Source:Open Clip Art Using Under Public Domain Attribution
I got a control in style template at one of my custom controls, Like this:
<Style TargetType="{x:Type advgenControls:CollapsibleControl}" x:Key="LeftPanel">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type advgenControls:CollapsibleControl}">
<Grid>
<ContentPresenter x:Name="PART_ContentPresenter"/>
<ResizeGrip Grid.Row="1" HorizontalAlignment="Stretch" Width="Auto" Height="Auto" HorizontalContentAlignment="Right" Margin="0,0,2,2"/>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
I just want to call that "PART_ContentPresenter". But that is xaml living in resources.
That is easy I can use GetTemplateChild("PART_ContentPresenter" ) and call at the OnApplyTemplate(). Please remember don't use it at OnInitialized(EventArgs e). At that time, styles has not loaded yet, you get a null object.:
Code
public override void OnApplyTemplate() | |
{ | |
base.OnApplyTemplate(); | |
if (this.IsInitialized) | |
{ | |
ContentPresenter cp = GetTemplateChild("PART_ContentPresenter" ) as ContentPresenter; | |
if(sections.Count >0){ | |
cp.Content = sections[0]; | |
} | |
} | |
} |
WPF Error:cannot set name attribute value '{control}'
Source:Open Clip Art Using Under Public Domain Attribution
I found the wpf user control cannot have any child has a name attribute, such as:
<advgenControls:CollapsibleControl> <TreeView x:Name="treeView" Style="{StaticResource MainLeftPanel}" /></advgenControls:CollapsibleControl>
It will have the error like this:
Cannot set Name attribute value 'treeView' on element 'TreeView'. 'TreeView' is under the scope of element 'CollapsibleControl', which already had a name registered when it was defined in another scope. Line 93 Position 5. (MC3093) - D:\Projects\AdvGenContact\AdvGenContact\AdvGenContact.WPF\MainWindow.xaml:93,5
I did a research on internet, I even tried some suggestions in internet, it doesn't work at all. I found that is no way to do that. I believe that is because User Control is not for that purpose. The user control is to hold some repeatable content across the applications. For example, I got a status bar which it need to place all every window in my application. Then I should create a user control for my own status bar and place into every window. In my case mentioned above, I wish to build a collapsible panel which has a different content in each window, even I will reuse that in other project. User Control is not my best. I should find an existing control to override. In this case, I should use HeaderItemsControl.
Note that: when I finish this control, I will put on my open source probject, AdvGen Contact Manager.