Saturday, December 26, 2015

[WPF] Scroll on new item for ItemsControl, ListView, DataGrid, etc.

Can be achieved using behaviors.

Friday, December 25, 2015

[WPF] Binding a Storyboard property relative to the target of the storyboard

In my search to achieve making application level storyboards with some changeable properties:

http://stackoverflow.com/questions/4472546/binding-a-storyboard-property-relative-to-the-target-of-the-storyboard


I have a storyboard which targets an element, and binds one of its own properties to a property on another element:

   
            Storyboard.TargetProperty="RenderTransform.X" 
            From="{Binding RelativeSource={RelativeSource AncestorType={x:Type Window}}, Path=ActualWidth}" 
            To="0" 
            Duration="0:0:5"/>
 
This storyboard works when the storyboard is stored in the resources of the window which holds the storyboard target. The 'From' value is correctly bound to the ActualWidth of the host Window instance.

However, I need to store the storyboard in my application level resources. From here, the storyboard does not seem to be able to target the window to determine the 'From' property. This is understandable as from inside , the binding won't be able to find an 'ancestor' of type Window.

I guess I need to be able to bind the 'From' value, relative to the target of the animation, rather than relative to the storyboard's DoubleAnimation.

Is this possible, and if so, how?

Here is the sample MainWindow.xaml:


    
     x:Key="localStoryBoard">
         
            Storyboard.TargetProperty="RenderTransform.X" 
            From="{Binding RelativeSource={RelativeSource AncestorType={x:Type Window}}, Path=ActualWidth}" 
            To="0" 
            Duration="0:0:5"/>
    
RoutedEvent="Button.Click"> Storyboard="{StaticResource centralStoryBoard}"/>
And here is an example app.xaml:
 x:Class="WpfApplication3.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             StartupUri="MainWindow.xaml">
    
        
         x:Key="centralStoryBoard">
             
                Storyboard.TargetProperty="RenderTransform.X" 
                From="{Binding RelativeSource={RelativeSource AncestorType={x:Type Window}}, Path=ActualWidth}" 
                To="0" 
                Duration="0:0:5"/>
        
    
This won't work, as the eventtrigger refers to the app.xaml version. If you change it to the local resource version, you can see it works.

[WPF] Binding to attached property

I'm trying to make a storyboard as an application resource where I can set a variable objects such as TO and FROM color transitions, the length of time between transitions, this seems like a good candidate:

http://stackoverflow.com/questions/19769263/binding-to-attached-property

I'm trying to bind from Button's ContentTemplate to attached property. I read all the answers for question similar to "binding to attached property" but I had no luck resolving the problem.
Please note that example presented here is a dumbed down version of my problem to avoid cluttering the problem with business code.
So, I do have static class with attached property:
using System.Windows;

namespace AttachedPropertyTest
{
  public static class Extender
  {
    public static readonly DependencyProperty AttachedTextProperty = 
      DependencyProperty.RegisterAttached(
        "AttachedText",
        typeof(string),
        typeof(DependencyObject),
        new PropertyMetadata(string.Empty));

    public static void SetAttachedText(DependencyObject obj, string value)
    {
      obj.SetValue(AttachedTextProperty, value);
    }

    public static string GetAttachedText(DependencyObject obj)
    {
      return (string)obj.GetValue(AttachedTextProperty);
    }

  }
}
and a window:
<Window x:Class="AttachedPropertyTest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:AttachedPropertyTest"
        Title="MainWindow" Height="350" Width="525">
  <Grid>
    <Button local:Extender.AttachedText="Attached">
      <TextBlock 
        Text="{Binding 
          RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Button},
          Path=(local:Extender.AttachedText)}"/>
    </Button>
  </Grid>
</Window>
That's pretty much it. I would expect t see "Attached" in the middle of the button. Instead it crashes with: Property path is not valid. 'Extender' does not have a public property named 'AttachedText'.
I've set breakpoints on SetAttachedText and GetAttachedText, and SetAttachedText is executed, so attaching it to button works. GetAttachedText is never executed though, so it does not find property when resolving.
My problem is actually more complicated (I'm trying to do binding from inside of Style in App.xaml) but let's start with the simple one.
Did I miss something? Thanks,




3 down vote accepted
Your attached property registration is wrong. The ownerType is Extender, not DependencyObject.
public static readonly DependencyProperty AttachedTextProperty = 
    DependencyProperty.RegisterAttached(
        "AttachedText",
        typeof(string),
        typeof(Extender), // here
        new PropertyMetadata(string.Empty));
See the MSDN documentation for RegisterAttached:
ownerType - The owner type that is registering the dependency property


[WPF] SharedSizeGroup IsSharedSizeScope Grid inside UserControl

While I can't confirm for sure that your requirement will work, I can confirm that as long as you set the Grid.IsSharedSizeScope Attached Property to True on a parent container control of both of the Grids that you have set up SharedSizeGroups for, then it should work. To find out for sure, just try it out... you could have probably tested it yourself quicker than the time it took you to write this question.

If there is no parent container control at the moment, just add one.... (put everything into it). The important thing to note here is that you're only supposed to set Grid.IsSharedSizeScope to True on the one single parent container control and not on every Grid.

SET Grid.IsSharedSizeScope in the PARENT control! NOT ON THE GRID ITSELF!

http://stackoverflow.com/a/26282796/2547795

[WPF] ListView Item spacing

Hopefully this will save someone else time. I found there are multiple 
properties that have to be set to 0 in order to completely remove the 
spacing between ListViewItems in a ListView control. In addition to 
Margin and Padding I had to set the BorderThickness to 0.  
 

     

     
 
http://stackoverflow.com/a/11423018/2547795