نمایش جدول خطی در Canvas به همراه سایز اسلایدردرWPF
سه شنبه 5 مرداد 1395زمانی که ما با canvas به همراه Xaml کار می کنیم ، قابلیت های مانند کشیدن محتویات به درون صفحه به وسیله ی موس را در اختیار نداریم ، بنابراین این مقاله به ما کمک می کند که gridline (جدول خطی) را در canvas نمایش دهیم.
پیش نیاز:
در اینجا از xaml به همراه wpf استفاده می کنیم.
استفاده از کد:
Xaml Design
<DockPanel>
<Grid DockPanel.Dock="Top">
<CheckBox Grid.Row="0" Name="ShowGridlines" Content="نمایش جدول خطی" Checked="ShowGridlines_OnChecked" Unchecked="ShowGridlines_OnUnchecked" ></CheckBox>
<Slider Grid.Row="0" ValueChanged="SliderValue_OnValueChanged" Margin="0 20 0 0" Minimum="5" Maximum="100" TickPlacement="BottomRight" TickFrequency="5" IsSnapToTickEnabled="True" Name="SliderValue" IsEnabled="False"></Slider>
</Grid>
<Canvas Name="ShapeCanvas">
</Canvas>
</DockPanel>
این xaml یک layout مانند زیر برای شما ایجاد می کند.

در code behind ما تعدادی رویداد برای مدیریت عملکرد اسلایدر ایجاد کرده ایم.
ShowGridlines_OnChecked : enable slider and draw grdlines ShowGridlines_OnUnchecked : disable slider and remove gridlines SliderValue_OnValueChanged : when slider enable then change it's size
و کد وابسته به رویدادها به شکل زیر است:
private void ShowGridlines_OnChecked(object sender, RoutedEventArgs e)
{
DrawGraph((int)SliderValue.Value, (int)SliderValue.Value, ShapeCanvas);
SliderValue.IsEnabled = true;
}
private void ShowGridlines_OnUnchecked(object sender, RoutedEventArgs e)
{
RemoveGraph(ShapeCanvas);
SliderValue.IsEnabled = false;
}
private void SliderValue_OnValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
{
if (ShowGridlines.IsChecked ?? false)
{
DrawGraph((int)SliderValue.Value, (int)SliderValue.Value, ShapeCanvas);
}
}
در این رویداد ها ما از 2 تابع DrawGraph و RemoveGraph به همراه بدنه های این دو تابع استفاده کرده ایم.
private void DrawGraph(int yoffSet, int xoffSet, Canvas mainCanvas)
{
RemoveGraph(mainCanvas);
Image lines = new Image();
lines.SetValue(Panel.ZIndexProperty, -100);
//Draw the grid
DrawingVisual gridLinesVisual = new DrawingVisual();
DrawingContext dct = gridLinesVisual.RenderOpen();
Pen lightPen = new Pen(_color1, 0.5), darkPen = new Pen(_color2, 1);
lightPen.Freeze();
darkPen.Freeze();
int yOffset = yoffSet,
xOffset = xoffSet,
rows = (int)(SystemParameters.PrimaryScreenHeight),
columns = (int)(SystemParameters.PrimaryScreenWidth),
alternate = yOffset == 5 ? yOffset : 1,
j = 0;
//Draw the horizontal lines
Point x = new Point(0, 0.5);
Point y = new Point(SystemParameters.PrimaryScreenWidth, 0.5);
for (int i = 0; i <= rows; i++, j++)
{
dct.DrawLine(j % alternate == 0 ? lightPen : darkPen, x, y);
x.Offset(0, yOffset);
y.Offset(0, yOffset);
}
j = 0;
//Draw the vertical lines
x = new Point(0.5, 0);
y = new Point(0.5, SystemParameters.PrimaryScreenHeight);
for (int i = 0; i <= columns; i++, j++)
{
dct.DrawLine(j % alternate == 0 ? lightPen : darkPen, x, y);
x.Offset(xOffset, 0);
y.Offset(xOffset, 0);
}
dct.Close();
RenderTargetBitmap bmp = new RenderTargetBitmap((int)SystemParameters.PrimaryScreenWidth,
(int)SystemParameters.PrimaryScreenHeight, 96, 96, PixelFormats.Pbgra32);
bmp.Render(gridLinesVisual);
bmp.Freeze();
lines.Source = bmp;
mainCanvas.Children.Add(lines);
}
private void RemoveGraph(Canvas mainCanvas)
{
foreach (UIElement obj in mainCanvas.Children)
{
if (obj is Image)
{
mainCanvas.Children.Remove(obj);
break;
}
}
}
- WPF
- 3k بازدید
- 1 تشکر