8,735
社区成员
发帖
与我相关
我的任务
分享
private T FindVisualChildByName<T>(DependencyObject parent, string name) where T : DependencyObject
{
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(parent); i++) {
var child = VisualTreeHelper.GetChild(parent, i);
string controlName = child.GetValue(Control.NameProperty) as string;
if (controlName == name) {
return child as T;
} else {
T result = FindVisualChildByName<T>(child, name);
if (result != null)
return result;
}
}
return null;
}
调用:
ContentPresenter temp = FindVisualChildByName<ContentPresenter>(this.dgTimeline, "Year");
if (temp != null) {
temp.Content = "自定义";
}
namespace MyTestWpf
{
public partial class MainWindow : Window
{
private ObservableCollection<CustomGanttLine> _data;
public MainWindow()
{
InitializeComponent();
_data = new ObservableCollection<CustomGanttLine> {
new CustomGanttLine{ Percentage0=0.2f, Percentage1=0.25f, Percentage2=0.02f, Percentage3=0.174f, Sum=245.0f}
};
this.dgTimeline.ItemsSource = _data;
}
}
public class CustomGanttLine
{
public Single Percentage0 { get; set; }
public Single Percentage1 { get; set; }
public Single Percentage2 { get; set; }
public Single Percentage3 { get; set; }
public Single Sum { get; set; }
}
public class CTUConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
Single percentage;
if (Single.TryParse(value.ToString(), out percentage)) {
return (percentage * 100.0f).ToString() + "%";
}
return "";
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}
public class CTDConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
Single percentage, sum;
if (Single.TryParse(values[0].ToString(), out percentage) && Single.TryParse(values[1].ToString(), out sum)) {
return (percentage * sum).ToString();
}
return "";
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}
}
<Window x:Class="MyTestWpf.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:MyTestWpf"
Title="MainWindow" Height="350" Width="525">
<Window.Resources>
<LinearGradientBrush x:Key="NormalBrush" EndPoint="0.5,1" StartPoint="0.5,0">
<GradientStop Color="#FFEDA25E" Offset="0"/>
<GradientStop Color="#FFEDA25E" Offset="0.5"/>
<GradientStop Color="#FFFA7A05" Offset="1"/>
</LinearGradientBrush>
<LinearGradientBrush x:Key="EndPointBrush" EndPoint="0.5,1" StartPoint="0.5,0.0">
<GradientStop Color="#FF3EB1EA" Offset="0"/>
<GradientStop Color="#FF61BFF1" Offset="0.5"/>
<GradientStop Color="#FF01A1F4" Offset="1"/>
</LinearGradientBrush>
<Style TargetType="TextBox">
<Setter Property="Height" Value="24"/>
<Setter Property="HorizontalAlignment" Value="Left"/>
<Setter Property="Width" Value="48"/>
<Setter Property="Padding" Value="2"/>
<Setter Property="FontSize" Value="12"/>
<Setter Property="IsReadOnly" Value="True"/>
<Setter Property="TextAlignment" Value="Center"/>
<Setter Property="TextWrapping" Value="NoWrap"/>
</Style>
<local:CTUConverter x:Key="ctuConverter"/>
<local:CTDConverter x:Key="ctdConverter"/>
</Window.Resources>
<Grid>
<Grid HorizontalAlignment="Left" Height="300" Margin="10,10,0,0" VerticalAlignment="Top" Width="285">
<DataGrid x:Name="dgTimeline" AutoGenerateColumns="False" HorizontalAlignment="Stretch" CanUserAddRows="False" CanUserResizeColumns="False" IsReadOnly="True" VerticalAlignment="Stretch" SelectionUnit="Cell" Grid.Row="1">
<DataGrid.Columns>
<DataGridTemplateColumn Width="Auto">
<DataGridTemplateColumn.HeaderTemplate>
<DataTemplate>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="186"/>
</Grid.ColumnDefinitions>
<Grid HorizontalAlignment="Stretch">
<Grid.RowDefinitions>
<RowDefinition Height="24" />
<RowDefinition Height="1" />
<RowDefinition Height="24" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="48*"/>
<ColumnDefinition Width="1*" />
<ColumnDefinition Width="48*"/>
<ColumnDefinition Width="1*" />
<ColumnDefinition Width="48*"/>
<ColumnDefinition Width="1*" />
<ColumnDefinition Width="48*"/>
</Grid.ColumnDefinitions>
<ContentPresenter Content="年" x:Name="Year" VerticalAlignment="Center" HorizontalAlignment="Center" Grid.ColumnSpan="7" />
<Rectangle Fill="#FFC9CACA" VerticalAlignment="Stretch" Height="1" Grid.Row="1" Grid.ColumnSpan="7" />
<ContentPresenter Content="1季度" Grid.Row="2" VerticalAlignment="Center" HorizontalAlignment="Center" />
<Rectangle Fill="#FFC9CACA" VerticalAlignment="Stretch" Width="1" Visibility="Visible" Grid.Row="2" Grid.Column="1" />
<ContentPresenter Content="2季度" Grid.Row="2" Grid.Column="2" VerticalAlignment="Center" HorizontalAlignment="Center" />
<Rectangle Fill="#FFC9CACA" VerticalAlignment="Stretch" Width="1" Visibility="Visible" Grid.Row="2" Grid.Column="3" />
<ContentPresenter Content="3季度" Grid.Row="2" Grid.Column="4" VerticalAlignment="Center" HorizontalAlignment="Center" />
<Rectangle Fill="#FFC9CACA" VerticalAlignment="Stretch" Width="1" Visibility="Visible" Grid.Row="2" Grid.Column="5" />
<ContentPresenter Content="4季度" Grid.Row="2" Grid.Column="6" VerticalAlignment="Center" HorizontalAlignment="Center" />
</Grid>
</Grid>
</DataTemplate>
</DataGridTemplateColumn.HeaderTemplate>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Grid>
<TextBox Margin= "0,0,0,0" VerticalAlignment="Top" Text="{Binding Percentage0, Mode=OneWay, Converter={StaticResource ctuConverter}}"/>
<TextBox Margin= "48,0,0,0" VerticalAlignment="Top" Text="{Binding Percentage1, Mode=OneWay, Converter={StaticResource ctuConverter}}"/>
<TextBox Margin= "96,0,0,0" VerticalAlignment="Top" Text="{Binding Percentage2, Mode=OneWay, Converter={StaticResource ctuConverter}}"/>
<TextBox Margin="144,0,0,0" VerticalAlignment="Top" Text="{Binding Percentage3, Mode=OneWay, Converter={StaticResource ctuConverter}}"/>
<TextBox Margin= "0,23,0,0" VerticalAlignment="Bottom">
<TextBox.Text>
<MultiBinding Converter="{StaticResource ctdConverter}">
<Binding Path="Percentage0"/>
<Binding Path="Sum"/>
</MultiBinding>
</TextBox.Text>
</TextBox>
<TextBox Margin= "48,23,0,0" VerticalAlignment="Bottom">
<TextBox.Text>
<MultiBinding Converter="{StaticResource ctdConverter}">
<Binding Path="Percentage1"/>
<Binding Path="Sum"/>
</MultiBinding>
</TextBox.Text>
</TextBox>
<TextBox Margin= "96,23,0,0" VerticalAlignment="Bottom">
<TextBox.Text>
<MultiBinding Converter="{StaticResource ctdConverter}">
<Binding Path="Percentage2"/>
<Binding Path="Sum"/>
</MultiBinding>
</TextBox.Text>
</TextBox>
<TextBox Margin="144,23,0,0" VerticalAlignment="Bottom">
<TextBox.Text>
<MultiBinding Converter="{StaticResource ctdConverter}">
<Binding Path="Percentage3"/>
<Binding Path="Sum"/>
</MultiBinding>
</TextBox.Text>
</TextBox>
</Grid>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
</Grid>
<!--<Button Content="Button" HorizontalAlignment="Left" Margin="432,154,0,0" VerticalAlignment="Top" Width="75" Click="Button_Click"/>-->
</Grid>
</Window>
public class GanttLine
{
public DateTime start { set; get; }
public DateTime end { set; get; }
}
public partial class ganttLine : UserControl
{
public static DependencyProperty MonthsProperty =
DependencyProperty.Register("Months", typeof(List<GanttLine>), typeof(ganttLine));
public List<GanttLine> Months
{
get { return (List<GanttLine>)GetValue(MonthsProperty); }
set { SetValue(MonthsProperty, value); }
}
public static DependencyProperty sumProperty =
DependencyProperty.Register("sum", typeof(float), typeof(ganttLine),
new FrameworkPropertyMetadata(0.0f, new PropertyChangedCallback(sumPropertyChangedCallback)));
private static void sumPropertyChangedCallback(DependencyObject sender, DependencyPropertyChangedEventArgs arg)
{
if (sender != null && sender is ganttLine)
{
ganttLine ctl = sender as ganttLine;
ctl.OnSumUpdated((float)arg.OldValue, (float)arg.NewValue);
}
}
public float sum
{
get { return (float)GetValue(sumProperty); }
set { SetValue(sumProperty, value); }
}
public float percentage0
{
set
{
CTU0.Text = (value * 100.0f).ToString() + "%";
CTD0.Text = (value * sum).ToString();
}
get
{
if (CTU0.Text.Length <= 1) return 0.0f;
return (float)(Convert.ToDouble(CTU0.Text.Substring(0, CTU0.Text.Length - 1)));
}
}
public float percentage1
{
set
{
CTU1.Text = (value * 100.0f).ToString() + "%";
CTD1.Text = (value * sum).ToString();
}
get
{
if (CTU1.Text.Length <= 1) return 0.0f;
return (float)(Convert.ToDouble(CTU1.Text.Substring(0, CTU1.Text.Length - 1)));
}
}
public float percentage2
{
set
{
CTU2.Text = (value * 100.0f).ToString() + "%";
CTD2.Text = (value * sum).ToString();
}
get
{
if (CTU2.Text.Length <= 1) return 0.0f;
return (float)(Convert.ToDouble(CTU2.Text.Substring(0, CTU2.Text.Length - 1)));
}
}
public float percentage3
{
set
{
CTU3.Text = (value * 100.0f).ToString() + "%";
CTD3.Text = (value * sum).ToString();
}
get
{
if (CTU3.Text.Length <= 1) return 0.0f;
return (float)(Convert.ToDouble(CTU3.Text.Substring(0, CTU3.Text.Length - 1)));
}
}
public Int32 Year { set; get; }
public ganttLine()
{
InitializeComponent();
Year = 1900;
Months = null;
this.Loaded += new RoutedEventHandler(ganttLine_Loaded);
}
public void OnSumUpdated(float _old, float _value)
{
CTD0.Text = (_value * percentage0).ToString();
CTD1.Text = (_value * percentage1).ToString();
CTD2.Text = (_value * percentage2).ToString();
CTD3.Text = (_value * percentage3).ToString();
}
void ganttLine_Loaded(object sender, RoutedEventArgs e)
{
if (null == Months) return;
foreach (GanttLine _line in Months)
{
DateTime _S = new DateTime(_line.start.Year, _line.start.Month, 1);
DateTime _E = new DateTime(_line.end.Year, _line.end.Month, 1);
DateTime _time = new DateTime(Year, 1, 1);
for (int _i = 0; _i < 12; _i++)
{
if (_time >= _S && _time <= _E)
{
switch (_i)
{
case 0: Month01.Visibility = Visibility.Visible; break;
case 1: Month02.Visibility = Visibility.Visible; break;
case 2: Month03.Visibility = Visibility.Visible; break;
case 3: Month04.Visibility = Visibility.Visible; break;
case 4: Month05.Visibility = Visibility.Visible; break;
case 5: Month06.Visibility = Visibility.Visible; break;
case 6: Month07.Visibility = Visibility.Visible; break;
case 7: Month08.Visibility = Visibility.Visible; break;
case 8: Month09.Visibility = Visibility.Visible; break;
case 9: Month10.Visibility = Visibility.Visible; break;
case 10: Month11.Visibility = Visibility.Visible; break;
case 11: Month12.Visibility = Visibility.Visible; break;
}
}
_time = _time.AddMonths(1);
}
}
}
}
<UserControl x:Class="wpfDemo.ganttLine"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:xctk="http://schemas.xceed.com/wpf/xaml/toolkit"
mc:Ignorable="d"
d:DesignHeight="48" d:DesignWidth="192
" >
<UserControl.Resources>
<LinearGradientBrush x:Key="NormalBrush" EndPoint="0.5,1" StartPoint="0.5,0">
<GradientStop Color="#FFEDA25E" Offset="0"/>
<GradientStop Color="#FFEDA25E" Offset="0.5"/>
<GradientStop Color="#FFFA7A05" Offset="1"/>
</LinearGradientBrush>
<LinearGradientBrush x:Key="EndPointBrush" EndPoint="0.5,1" StartPoint="0.5,0.0">
<GradientStop Color="#FF3EB1EA" Offset="0"/>
<GradientStop Color="#FF61BFF1" Offset="0.5"/>
<GradientStop Color="#FF01A1F4" Offset="1"/>
</LinearGradientBrush>
</UserControl.Resources>
<Grid x:Name="LayoutRoot">
<StackPanel x:Name="Month" Margin="0" Width="192" Height="24" HorizontalAlignment="Left" Orientation="Horizontal" VerticalAlignment="Top">
<Rectangle x:Name="Month01" Fill="{DynamicResource NormalBrush}" StrokeThickness="1" Width="15" Visibility="Hidden"/>
<Rectangle x:Name="Xonth01" Fill="{DynamicResource EndPointBrush}" StrokeThickness="1" Width="1" Visibility="Hidden"/>
<Rectangle x:Name="Month02" Fill="{DynamicResource NormalBrush}" StrokeThickness="1" Width="15" Visibility="Hidden"/>
<Rectangle x:Name="Xonth02" Fill="{DynamicResource EndPointBrush}" StrokeThickness="1" Width="1" Visibility="Hidden"/>
<Rectangle x:Name="Month03" Fill="{DynamicResource NormalBrush}" StrokeThickness="1" Width="15" Visibility="Hidden"/>
<Rectangle x:Name="Xonth03" Fill="{DynamicResource EndPointBrush}" StrokeThickness="1" Width="1" Visibility="Hidden"/>
<Rectangle x:Name="Month04" Fill="{DynamicResource NormalBrush}" StrokeThickness="1" Width="15" Visibility="Hidden"/>
<Rectangle x:Name="Xonth04" Fill="{DynamicResource EndPointBrush}" StrokeThickness="1" Width="1" Visibility="Hidden"/>
<Rectangle x:Name="Month05" Fill="{DynamicResource NormalBrush}" StrokeThickness="1" Width="15" Visibility="Hidden"/>
<Rectangle x:Name="Xonth05" Fill="{DynamicResource EndPointBrush}" StrokeThickness="1" Width="1" Visibility="Hidden"/>
<Rectangle x:Name="Month06" Fill="{DynamicResource NormalBrush}" StrokeThickness="1" Width="15" Visibility="Hidden"/>
<Rectangle x:Name="Xonth06" Fill="{DynamicResource EndPointBrush}" StrokeThickness="1" Width="1" Visibility="Hidden"/>
<Rectangle x:Name="Month07" Fill="{DynamicResource NormalBrush}" StrokeThickness="1" Width="15" Visibility="Hidden"/>
<Rectangle x:Name="Xonth07" Fill="{DynamicResource EndPointBrush}" StrokeThickness="1" Width="1" Visibility="Hidden"/>
<Rectangle x:Name="Month08" Fill="{DynamicResource NormalBrush}" StrokeThickness="1" Width="15" Visibility="Hidden"/>
<Rectangle x:Name="Xonth08" Fill="{DynamicResource EndPointBrush}" StrokeThickness="1" Width="1" Visibility="Hidden"/>
<Rectangle x:Name="Month09" Fill="{DynamicResource NormalBrush}" StrokeThickness="1" Width="15" Visibility="Hidden"/>
<Rectangle x:Name="Xonth09" Fill="{DynamicResource EndPointBrush}" StrokeThickness="1" Width="1" Visibility="Hidden"/>
<Rectangle x:Name="Month10" Fill="{DynamicResource NormalBrush}" StrokeThickness="1" Width="15" Visibility="Hidden"/>
<Rectangle x:Name="Xonth10" Fill="{DynamicResource EndPointBrush}" StrokeThickness="1" Width="1" Visibility="Hidden"/>
<Rectangle x:Name="Month11" Fill="{DynamicResource NormalBrush}" StrokeThickness="1" Width="15" Visibility="Hidden"/>
<Rectangle x:Name="Xonth11" Fill="{DynamicResource EndPointBrush}" StrokeThickness="1" Width="1" Visibility="Hidden"/>
<Rectangle x:Name="Month12" Fill="{DynamicResource NormalBrush}" StrokeThickness="1" Width="15" Visibility="Hidden"/>
<Rectangle x:Name="Xonth12" Fill="{DynamicResource EndPointBrush}" StrokeThickness="1" Width="1" Visibility="Hidden"/>
</StackPanel>
<StackPanel x:Name="EndPoint" Margin="0" Width="192" Height="24" HorizontalAlignment="Left" Orientation="Horizontal" VerticalAlignment="Top">
<Rectangle x:Name="EP01" Fill="{DynamicResource EndPointBrush}" StrokeThickness="1" Width="16" Visibility="Hidden"/>
<Rectangle x:Name="EP02" Fill="{DynamicResource EndPointBrush}" StrokeThickness="1" Width="16" Visibility="Hidden"/>
<Rectangle x:Name="EP03" Fill="{DynamicResource EndPointBrush}" StrokeThickness="1" Width="16" Visibility="Hidden"/>
<Rectangle x:Name="EP04" Fill="{DynamicResource EndPointBrush}" StrokeThickness="1" Width="16" Visibility="Hidden"/>
<Rectangle x:Name="EP05" Fill="{DynamicResource EndPointBrush}" StrokeThickness="1" Width="16" Visibility="Hidden"/>
<Rectangle x:Name="EP06" Fill="{DynamicResource EndPointBrush}" StrokeThickness="1" Width="16" Visibility="Hidden"/>
<Rectangle x:Name="EP07" Fill="{DynamicResource EndPointBrush}" StrokeThickness="1" Width="16" Visibility="Hidden"/>
<Rectangle x:Name="EP08" Fill="{DynamicResource EndPointBrush}" StrokeThickness="1" Width="16" Visibility="Hidden"/>
<Rectangle x:Name="EP09" Fill="{DynamicResource EndPointBrush}" StrokeThickness="1" Width="16" Visibility="Hidden"/>
<Rectangle x:Name="EP10" Fill="{DynamicResource EndPointBrush}" StrokeThickness="1" Width="16" Visibility="Hidden"/>
<Rectangle x:Name="EP11" Fill="{DynamicResource EndPointBrush}" StrokeThickness="1" Width="16" Visibility="Hidden"/>
<Rectangle x:Name="EP12" Fill="{DynamicResource EndPointBrush}" StrokeThickness="1" Width="16" Visibility="Hidden"/>
</StackPanel>
<TextBox Height="24" HorizontalAlignment="Left" Margin= "0,0,0,0" Name="CTU0" VerticalAlignment="Top" Width="48" Padding="2" IsReadOnly="True" Cursor="Arrow" Text="0.0%" FontSize="12" Background="#00FFFFFF" FontStretch="Normal" TextAlignment="Center" TextWrapping="NoWrap" GotMouseCapture="CTU0_GotMouseCapture" />
<!--<xctk:CalculatorUpDown Height="24" HorizontalAlignment="Left" Margin="0,0,0,0" Name="CNU0" VerticalAlignment="Top" Width="48" FormatString="P1" Increment="0.1" Maximum="1.0" Minimum="0" Visibility="Hidden" LostMouseCapture="CNU0_LostMouseCapture" />-->
<TextBox Height="24" HorizontalAlignment="Left" Margin= "48,0,0,0" Name="CTU1" VerticalAlignment="Top" Width="48" Padding="2" IsReadOnly="True" Cursor="Arrow" Text="0.0%" FontSize="12" Background="#00FFFFFF" FontStretch="Normal" TextAlignment="Center" TextWrapping="NoWrap" />
<TextBox Height="24" HorizontalAlignment="Left" Margin= "96,0,0,0" Name="CTU2" VerticalAlignment="Top" Width="48" Padding="2" IsReadOnly="True" Cursor="Arrow" Text="0.0%" FontSize="12" Background="#00FFFFFF" FontStretch="Normal" TextAlignment="Center" TextWrapping="NoWrap" />
<TextBox Height="24" HorizontalAlignment="Left" Margin="144,0,0,0" Name="CTU3" VerticalAlignment="Top" Width="48" Padding="2" IsReadOnly="True" Cursor="Arrow" Text="0.0%" FontSize="12" Background="#00FFFFFF" FontStretch="Normal" TextAlignment="Center" TextWrapping="NoWrap" />
<TextBox Height="24" HorizontalAlignment="Left" Margin= "0,23,0,0" Name="CTD0" VerticalAlignment="Bottom" Width="48" Padding="2" IsReadOnly="True" Cursor="Arrow" />
<TextBox Height="24" HorizontalAlignment="Left" Margin= "48,23,0,0" Name="CTD1" VerticalAlignment="Bottom" Width="48" Padding="2" IsReadOnly="True" Cursor="Arrow" />
<TextBox Height="24" HorizontalAlignment="Left" Margin= "96,23,0,0" Name="CTD2" VerticalAlignment="Bottom" Width="48" Padding="2" IsReadOnly="True" Cursor="Arrow" />
<TextBox Height="24" HorizontalAlignment="Left" Margin="144,23,0,0" Name="CTD3" VerticalAlignment="Bottom" Width="48" Padding="2" IsReadOnly="True" Cursor="Arrow" />
</Grid>
</UserControl>