Binding położenia WPF

Binding położenia WPF
SY
  • Rejestracja:około 12 lat
  • Ostatnio:prawie 12 lat
  • Postów:5
0

Mam taki kod i chcę zmienić tak aby:
Za każdym razem gdy zmienię płożenie MyFoo automatycznie zmieniło się położenie Labela
I jak to zrobić dynamicznie.
Tak aby
Każdy utworzony label miał odpowiednią klasę w której będzie położenie.

Kopiuj
namespace WPFBindingTest
{
    public partial class Window1 : Window
    {
        public Foo MyFoo;

        public Window1()
        {
            InitializeComponent();
            MyFoo = new Foo();
        }

        private void button1_Click(object sender, RoutedEventArgs e)
        {
            MyFoo.W1 = new Thickness(100, 90, 90, 90);

          
            
        }
    }

    public class Foo
    {
        public Thickness W1 { get; set; }
        
    }
}
Kopiuj
<Window x:Class="WPFBindingTest.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300" Name="NameOfWindow">
    <Grid>
        <Label Height="28"  Name="label1" Background="Bisque" Margin="{Binding ElementName=NameOfWindow, Path=MyFoo.W1}" VerticalAlignment="Top" />
        <Button Height="23" HorizontalAlignment="Right" Margin="0,0,32,48" Name="button1" VerticalAlignment="Bottom" Width="89" Click="button1_Click">Set Properties</Button>
       
    </Grid>
</Window>
edytowany 2x, ostatnio: sydneyice
wedlock
  • Rejestracja:prawie 13 lat
  • Ostatnio:prawie 4 lata
  • Lokalizacja:Bartoszyce
  • Postów:180
0

Tu znajdziesz informacje o bindowaniu do konkretnego źródła na 4 różne sposoby.

http://www.jayway.com/2011/05/17/bind-from-xaml-to-property-defined-in-code-behind/

1

xaml

Kopiuj
<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:my="clr-namespace:WpfApplication1"
        Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <my:MarginConverter x:Key="convMargin" />
    </Window.Resources>
    <Grid>
        <ProgressBar Height="10" HorizontalAlignment="Left" Margin="164,142,0,0" Name="progressBar1"
                     VerticalAlignment="Top" Width="100" />
        <Label Content="Label" Height="28" HorizontalAlignment="Left" Name="label1"
               VerticalAlignment="Top">
            <Label.Margin>
                <MultiBinding Converter="{StaticResource convMargin}">
                    <Binding ElementName="progressBar1" Path="Margin.Left" />
                    <Binding ElementName="progressBar1" Path="Margin.Top" />
                    <Binding ElementName="progressBar1" Path="Margin.Right" />
                    <Binding ElementName="progressBar1" Path="Margin.Bottom" />
                </MultiBinding>
            </Label.Margin>
        </Label>
        <Button Content="Button" Height="23" HorizontalAlignment="Left" Margin="416,12,0,0"
                Name="button1" VerticalAlignment="Top" Width="75" Click="button1_Click" />
        <Label HorizontalAlignment="Left" Margin="416,41,0,0" Name="label2"
               VerticalAlignment="Top" />
    </Grid>
</Window>

cs

Kopiuj
using System;
using System.Globalization;
using System.Windows;
using System.Windows.Data;

namespace WpfApplication1
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        Random rand = new Random();

        public MainWindow()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, RoutedEventArgs e)
        {
            progressBar1.Margin = new Thickness(rand.NextDouble() * 292 + 12,
                rand.NextDouble() * 208 + 70, 0, 0);

            label2.Content = String.Format("Left: {1:0.##}{0}Top: {2:0.##}", Environment.NewLine,
                progressBar1.Margin.Left, progressBar1.Margin.Top);
        }
    }

    public class MarginConverter : IMultiValueConverter
    {
        public object Convert(object[] values, Type targetType, object parameter,
            CultureInfo culture)
        {
            if (targetType != typeof(Thickness))
                throw new InvalidOperationException("The target must be a Thickness");

            return new Thickness((double)values[0], (double)values[1] - 30, (double)values[2],
                (double)values[3]);
        }

        public object[] ConvertBack(object value, Type[] targetTypes, object parameter,
            CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }
}

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.