IValueConverter and ValidationRule

image_pdfimage_print


   
  
<Window x:Class="WpfApplication1.Window1"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  xmlns:sys="clr-namespace:System;assembly=mscorlib"
  xmlns:local="clr-namespace:WpfApplication1" 
  Title="Random Numbers Built to Order">

  <Window.Resources>
    <ObjectDataProvider x:Key="nextRandomNumber" ObjectType="{x:Type sys:Random}"  MethodName="Next">
      <ObjectDataProvider.MethodParameters>
        <sys:Int32>0</sys:Int32>
        <sys:Int32>10</sys:Int32>
      </ObjectDataProvider.MethodParameters>
    </ObjectDataProvider>
    <local:StringToInt32Converter x:Key="numConverter" />
  </Window.Resources>

  <StackPanel DataContext="{StaticResource nextRandomNumber}">
    <Label>Min</Label>
    <TextBox Name="minTextBox" ToolTip="{Binding ElementName=minTextBox, Path=(Validation.Errors)&#91;0&#93;.ErrorContent}">
      <TextBox.Text>
        <Binding Path="MethodParameters&#91;0&#93;" BindsDirectlyToSource="True" Converter="{StaticResource numConverter}">
          <Binding.ValidationRules>
            <local:IntegerValidator />
          </Binding.ValidationRules>
        </Binding>
      </TextBox.Text>
    </TextBox>
    <Label>Max</Label>
    <TextBox Name="maxTextBox" ToolTip="{Binding ElementName=maxTextBox, Path=(Validation.Errors)&#91;0&#93;.ErrorContent}">
      <TextBox.Text>
        <Binding Path="MethodParameters&#91;1&#93;" BindsDirectlyToSource="True" Converter="{StaticResource numConverter}">
          <Binding.ValidationRules>
            <local:IntegerValidator />
          </Binding.ValidationRules>
        </Binding>
      </TextBox.Text>
    </TextBox>
    <Label>Random</Label>
    <TextBox Text="{Binding Mode=OneTime}" IsReadOnly="True" />
    <Button Name="nextButton">Next</Button>
  </StackPanel>
</Window>
//File:Window.xaml.cs

using System;
using System.Collections.Generic;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;

namespace WpfApplication1 {
  public partial class Window1 : System.Windows.Window {

    public Window1() {
      InitializeComponent();
      nextButton.Click += new RoutedEventHandler(nextButton_Click);
    }

    void nextButton_Click(object sender, RoutedEventArgs e) {
      ((ObjectDataProvider)Resources["nextRandomNumber"]).Refresh();
    }

  }

  public class StringToInt32Converter : IValueConverter {
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) {
      return ((int)value).ToString();
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) {
      return int.Parse((string)value);
    }
  }

  public class IntegerValidator : ValidationRule {
    public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo) {
      try {
        int.Parse((string)value);
        return ValidationResult.ValidResult;
      }
      catch( Exception ex ) {
        return new ValidationResult(false, ex.Message);
      }
    }
  }
}

   
    
     


Specify Validation Rules for a Binding

image_pdfimage_print


















//File:Window.xaml.cs
using System.Globalization;
using System.Windows.Controls;

namespace WpfApplication1
{
public class PercentageRule : ValidationRule
{
public override ValidationResult Validate(object value,CultureInfo cultureInfo)
{
string stringValue = value as string;
if(!string.IsNullOrEmpty(stringValue))
{
double doubleValue;
if(double.TryParse(stringValue, out doubleValue))
{
if(doubleValue >= 0 && doubleValue <= 100) { return new ValidationResult(true, null); } } } return new ValidationResult(false, "Must be a number between 0 and 100"); } } } [/csharp]

Rotate

image_pdfimage_print


   
     
<Window x:Class="Workspace.DockExample"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Workspace" Width="640" Height="480">
        <Canvas Height="200" Width="200">
          <Polyline Points="25,25 0,50 25,75 50,50 25,25 25,0" Stroke="Blue" StrokeThickness="10"
            Canvas.Left="75" Canvas.Top="50">
            <Polyline.RenderTransform>
              <RotateTransform CenterX="25" CenterY="50" Angle="45" />
            </Polyline.RenderTransform>
          </Polyline>
          
        
          <Polyline Points="25,25 0,50 25,75 50,50 25,25 25,0" Stroke="Blue" StrokeThickness="10"
            Opacity="0.25" Canvas.Left="75" Canvas.Top="50" />           
        </Canvas>

</Window>

   
    
    
    
    
     


Translate

image_pdfimage_print


   
     

<Window x:Class="Workspace.DockExample"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Workspace" Width="640" Height="480">
        <Canvas Height="200" Width="200">
          <Polyline Points="25,25 0,50 25,75 50,50 25,25 25,0" Stroke="Blue" StrokeThickness="10"
            Canvas.Left="75" Canvas.Top="50">
            <Polyline.RenderTransform>
              <TranslateTransform X="50" Y="0" />
            </Polyline.RenderTransform>
          </Polyline>
          
          <!-- Shows the original position of the polyline. -->
          <Polyline Points="25,25 0,50 25,75 50,50 25,25 25,0" Stroke="Blue" StrokeThickness="10"
            Opacity="0.25" Canvas.Left="75" Canvas.Top="50" />            
        </Canvas>

</Window>

   
    
    
    
    
     


Gradient brushes within a DrawingBrush

image_pdfimage_print


   
     

<Window x:Class="Workspace.DockExample"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Workspace" Width="640" Height="480">
      <Rectangle Width="50" Height="50" Grid.Row="2" Grid.Column="1">
        <Rectangle.Fill>
          <VisualBrush>
            <VisualBrush.Visual>
              <StackPanel Background="White">
                <Button Margin="1">A Button</Button>
                <Button Margin="1">Another Button</Button>
              </StackPanel>
            </VisualBrush.Visual>
          </VisualBrush>
        </Rectangle.Fill>
      </Rectangle>

</Window>

   
    
    
    
    
     


Print Visual Tree

image_pdfimage_print










//File:Window.xaml.cs
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;

using System.Collections;

namespace WPFTrees
{

public partial class Window1 : System.Windows.Window
{

public Window1()
{
InitializeComponent();
}

public void PrintVisualTree(Visual visual)
{
Console.WriteLine(visual.GetType().ToString()) ;

for (int i = 0; i < VisualTreeHelper.GetChildrenCount(visual); i++) { PrintVisualTree((Visual)VisualTreeHelper.GetChild(visual, i)); } } private void buttonPrint_Click(Object sender, RoutedEventArgs e) { PrintVisualTree(this.button1); } } } [/csharp]

Find enclosure component

image_pdfimage_print


   
   

<Window x:Class="VisualTree.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="VisualTree" Height="300" Width="300">
  <Grid>      
      <Button Click="MyClickEvent" Name="btnGo">
        <TextBox Width="173" Height="27" Name="txt">
        </TextBox>        
      </Button>      
    </Grid>  
</Window>
//File:Window.xaml.cs
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;

namespace VisualTree
{
    public partial class Window1 : System.Windows.Window
    {
        public Window1()
        {
            InitializeComponent();
        }
        void MyClickEvent(object sender, RoutedEventArgs e)
        {
            object desiredNode = btnGo.FindName("txt");
            if (desiredNode is TextBox)
            {
                TextBox desiredChild = desiredNode as TextBox;
                desiredChild.Background = Brushes.Green;
            }
        }

    }
}