我在wpf的窗口中使用viewbox,控件是通过编程方式添加的。我希望窗口中的控件在窗口大小发生变化时能够灵活变化。但是,控件的外观似乎发生了变化,宽度和高度没有改变,即使我对控件使用 sizeChanged 事件,当我看到控件的大小发生变化时它也没有触发。
这是我在主窗口中的示例 xaml:
<Grid>
<Viewbox Name="viewbox1">
<Grid Height="667" HorizontalAlignment="Left" Margin="241,31,0,0" Name="grid1" VerticalAlignment="Top" Width="745" Background="White" />
</Grid>
</Viewbox>
</Grid>
而动态添加控制代码为:
VideoChannel vc = new VideoChannel();
this.grid1.Children.Add(vc);
VideoChannel xaml 是这样的:
<TabControl Height="613" HorizontalAlignment="Left" Margin="0,12,0,0" Name="tabControl1" VerticalAlignment="Top" Width="638" Background="{x:Null}" SelectionChanged="tabControl1_SelectionChanged">
<TabItem Header="-P1-" Name="tabItem1" Height="30" FontFamily="Meiryo" FontWeight="Bold" BorderBrush="#FFA0A0A0" Background="#FFB7DEE8">
<Grid Height="566">
<Button BorderBrush="{x:Null}" ClickMode="Press" Height="36" Margin="48,11,0,0" Name="btnVideo1" VerticalAlignment="Top" HorizontalAlignment="Left" Width="36" Click="btnVideo1_Click">
</Button>
</Grid>
</TabItem>
</TabControl>
只是一个有一些按钮的tabControl,所以点击一个按钮,它会在tabControl中动态添加一些东西:
VideoType1 vt1 = new VideoType1();
this.grid1.Children.Add(vt1);
最后,我想知道它的大小的最终控件是:
<Border Background="DimGray" MinHeight="144" MinWidth="176" Name="border1" Grid.Column="1" Margin="0,63,0,0" Height="385" VerticalAlignment="Top" HorizontalAlignment="Left" Width="527" />
我想截取border1的图片,当我使用原始尺寸时,毕竟没问题。但是,如果我改变窗口,border1的尺寸没有改变,即使我看是变大还是变小。
我尝试使用 PointToWindow 没问题:
Point video = border1.PointToScreen(new Point(0, 0));
它工作正常,(顶部和左侧的边框点会改变) 但我不确定用户是否会改变窗口的高度或宽度(所以我不能使用点的缩放方法)。
我在 border1 中添加了 sizeChanged 事件,它没有触发(我不知道原因)。
捕获代码是:
Point video = border1.PointToScreen(new Point(0, 0));
int w = (int)video.X + (int)border1.Width;
int h = (int)video.Y + (int)border1.Height;
int hsi = (int)border1.Height;
if (canCap == true)
{
int wid = (int)border1.Margin.Right - (int)video.X;
int hei = (int)border1.Margin.Bottom - (int)video.Y;
System.Drawing.Bitmap b = new System.Drawing.Bitmap((int)border1.Width,(int)border1.Height);
using (System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(b))
{
g.CopyFromScreen((int)video.X, (int)video.Y, (int)border1.Margin.Right, (int)border1.Margin.Bottom, b.Size, System.Drawing.CopyPixelOperation.SourceCopy);
}
Microsoft.Win32.SaveFileDialog dlg = new Microsoft.Win32.SaveFileDialog();
dlg.DefaultExt = ".png";
dlg.Filter = "JPeg Image|*.jpg|Bitmap Image|*.bmp|Gif Image|*.gif|PNG Image|*.png";
Nullable<bool> result = dlg.ShowDialog();
if (result == true)
{
string filename = dlg.FileName;
b.Save(filename);
}
}
else
return;
然后我尝试获取 border1 的实际大小(当窗口更改时)。
在捕获代码中,尺寸(border1.Width 和 border1.Height)始终是原始尺寸(527x385)。
不好意思解释的不好,问题的核心是:
使用viewbox来拉伸(stretch)控件,但是当我在调整窗口大小时改变它的大小时控件大小没有改变(viewbox的区域是整个窗口)。
任何答案表示赞赏。
最佳答案
使用 Viewbox 的 stretch 属性设置合适的拉伸(stretch)模式。
关于viewbox 中的 C# wpf 控件,但无法获得实际大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16959727/