我有一个Grid
内部Canvas
定义如下:
<Canvas x:Name="outerCanvas">
<Grid Grid.Row="1" Name="cGrid" ShowGridLines="True" Width="{Binding Path=ActualWidth, RelativeSource={RelativeSource AncestorType={x:Type Canvas}}}" Height="{Binding Path=ActualHeight, RelativeSource={RelativeSource AncestorType={x:Type Canvas}}}">
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition />
<RowDefinition />
</Grid.RowDefinitions>
<Rectangle Name="rectangle1" Stroke="Black" Fill="AntiqueWhite" />
<Rectangle Grid.Row="0" Grid.Column="1" Grid.ColumnSpan="1" Grid.RowSpan="1" Name="rectangle2" Stroke="Black" Fill="AliceBlue" />
<Rectangle Grid.Row="0" Grid.Column="2" Grid.ColumnSpan="1" Grid.RowSpan="1" Name="rectangle3" Stroke="Black" Fill="Aqua" />
<Rectangle Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="3" Grid.RowSpan="1" Name="rectangle4" Stroke="Black" Fill="DarkViolet" />
</Grid>
</Canvas>
Run Code Online (Sandbox Code Playgroud)
我的问题是,在窗口的构造,后InitializeComponents()
两种Grid.ColumnDefinitions[0].ActualWidth
或"任何矩形".ActualWidth
都被设置为0.0(高度相同).我不知道如何获取这些信息.有帮助吗?
观察:
Canvas/Grid
占据整个窗口空间,因此其中的每个矩形都有ActualWidth …
我正在尝试用元素高度设置动画ReactCSSTransitionGroup
,所以这就是我想要的动画效果:
http://jsfiddle.net/cherrry/hgk4Lme9/
问题是,我总是不知道该元素的高度,所以我试图破解scrollHeight
,clientHeight
期间或类似的东西componentDidMount
,并尝试设置node.style.height
或规则添加到样式表
http://jsfiddle.net/cherrry/dz8uod7u/
让动画看起来很好,但是当元素进入时,它会闪现一点,缩放动画看起来很奇怪
应该是因为询问node.scrollHeight
导致渲染立即发生,所以无论如何都要获得相同的信息并在动画开始之前注入css规则?或者我应该考虑其他方式?
我对max-height
解决方案不是很满意,因为当max-height
不接近或小于时,结果动画速度将非常奇怪height
,并且我的组件的高度确实变化很大.
我可以想象最终的解决方案可能有点混乱,但我认为将它变成一个Mixin将足以在任何地方重复使用它
两者都是相当笼统的术语,但我很想知道这些高度何时会与我们使用虚拟化的情况不同?
还有一个问题:我在MSDN上阅读:
如果CanContentScroll为true,则ExtentHeight,ScrollableHeight,ViewportHeight和VerticalOffset属性的值是项目数.如果CanContentScroll为false,则这些属性的值为"设备无关像素".
但是我遇到了ViewPort Height的问题:我在应用程序中有2个列表框:
1.启用了虚拟化并且CanContentScroll = True.
2.哪些没有虚拟化,CanContentScroll = True.
在ListBox 1中,拖放视口高度达到4/5(当前可见的元素数).但是在ListBox 2中,我得到的视口高度等于列表框的实际高度.
为何如此区别?
更多的发现:
1.可滚动高度是滚动查看器2中不可见的项目数
.视口高度是滚动查看器中可见的项目数.
因此,视口高度+ ScrollableHeight =范围高度
有人可以解释两个列表框之间有什么区别吗?在Listbox 1的情况下我需要ViewPort hieght
我在silverlight控件上有一个网格,我以编程方式添加了一个画布,在画布中我正在加载并显示Image.
我还在画布上添加一个旋转.问题是默认情况下,旋转的CenterX和CenterY是画布的左上角.我想要的是围绕画布中心的旋转.
为此,我尝试将旋转的CenterX和CenterY设置为Images ActualWidth
/ 2和ActualHeight
/ 2,但是我发现ActualWidth
并且ActualHeight
并不总是填充,至少不会立即填充.我如何强迫他们更新?
即使在图像上使用DownloadProgress事件似乎也不能保证填充ActualWidth和ActualHeight,也没有使用this.Dispatcher.BeginInvoke()...
Image imgTest = new Image();
Canvas cnvTest = new Canvas();
Uri uriImage = new Uri("myurl", UriKind.RelativeOrAbsolute);
System.Windows.Media.Imaging.BitmapImage bmpDisplay = new System.Windows.Media.Imaging.BitmapImage(uriImage);
bmpDisplay.DownloadProgress += new EventHandler<System.Windows.Media.Imaging.DownloadProgressEventArgs>(this.GetActualDimensionsAfterDownload);
imgTest.Source = bmpDisplay;
imgTest.Stretch = Stretch.Uniform;
imgTest.HorizontalAlignment = HorizontalAlignment.Center;
imgTest.VerticalAlignment = VerticalAlignment.Center;
cnvTest.Children.Add(imgTest);
this.grdLayout.Children.Add(imgTest);
this.Dispatcher.BeginInvoke(new Action(GetActualDimensions));
Run Code Online (Sandbox Code Playgroud) 我想添加WPF路径InkCanvas
并使用选择来选择WPF路径.所以,我使用这段代码.
System.Windows.Shapes.Path path = drawCanvas.Children[i] as System.Windows.Shapes.Path;
drawCanvas.Children.RemoveAt(i);
inkCanvas.Children.Add(path);
Run Code Online (Sandbox Code Playgroud)
这是输出.我必须从0,0中选择WPF Path,因为Actualwidth
它ActualHeight
从0,0开始.
如何选择绝对WPF路径?
谢谢
编辑:
现在,我可以使用此代码绝对选择它.
System.Windows.Shapes.Path path = drawCanvas.Children[i] as System.Windows.Shapes.Path;
drawCanvas.Children.RemoveAt(i);
path.Margin = new Thickness(-getMinX(path), -getMinY(path), 0, 0);
containPath.Children.Add(path);
containPath.Width = getMaxX(path) - getMinX(path);
containPath.Height = getMaxY(path) - getMinY(path);
containPath.Margin = new Thickness(getMinX(path), getMinY(path), 0, 0);
inkCanvas.Children.Add(containPath);
Run Code Online (Sandbox Code Playgroud) 我有两个独立的ItemsControl
s并排出现.在ItemsControl
小号绑定到相同的ItemsSource
,但他们不同的方式显示数据.
左侧显示的每个项目很可能小于右侧的相同项目.这会导致问题,因为行不会排成一行,因此我需要左侧的项目绑定到右侧的项目.
ItemsControl ItemsControl
|Item 1 |Item 1
|Item 2 |Item 2
|Item 3 |
|Item 4 |Item 3
Run Code Online (Sandbox Code Playgroud)
如您所见,右侧的第2项更大,因此它会抛弃对齐.因此,如果我可以将左侧的项目2绑定到右侧的项目2,ActualHeight
则问题将得到解决.我怎样才能在XAML中做到这一点?
编辑:为了使事情变得更复杂,ItemsControl
右边需要从右向左滚动,但两者都ItemsControls
需要一起向上和向下滚动.基本上,左边的一个为右边的项目提供了各种标题.
我需要一个Viewport3D
用于进行几何计算的唯一目的Petzold.Media3D.ViewportInfo
.我宁愿不把它放在一个Window
或以其他方式呈现它.
我试图通过Viewport3D
使用以下C#方法实例化并设置一些属性来实现此目的:
private Viewport3D CreateViewport(MainSettings settings)
{
var cameraPosition = new Point3D(0, 0, settings.CameraHeight);
var cameraLookDirection = new Vector3D(0, 0, -1);
var cameraUpDirection = new Vector3D(0, 1, 0);
var camera = new PerspectiveCamera
{
Position = cameraPosition,
LookDirection = cameraLookDirection,
UpDirection = cameraUpDirection
};
var viewport = new Viewport3D
{
Camera = camera,
Width = settings.ViewportWidth,
Height = settings.ViewportHeight
};
return viewport;
}
Run Code Online (Sandbox Code Playgroud)
稍后,我正在尝试使用此视口使用此方法将鼠标位置转换为3D位置:
public Point3D? Point2dToPoint3d(Point point)
{
var range = …
Run Code Online (Sandbox Code Playgroud) 我有Canvas
一个TextBlock
像这样:
<Canvas x:Name="ContentPanel" Grid.Row="1" DoubleTapped="ContentPanel_DoubleTapped">
<TextBlock x:Name="WordBlock" FontSize="226.667" FontFamily="Segoe UI Semilight" TextAlignment="Center"
RenderTransformOrigin="0.5, 0.5">
<TextBlock.RenderTransform>
<TranslateTransform x:Name="translate"/>
</TextBlock.RenderTransform>
</TextBlock>
</Canvas>
Run Code Online (Sandbox Code Playgroud)
我的应用程序是这样的,当用户导航到此页面时,TextBlock
将以中心为中心Canvas
,如果TextBlock
宽度大于画布的宽度,则会出现选框动画:
private void SetAnimation()
{
Canvas.SetLeft(WordBlock, (ContentPanel.ActualWidth - WordBlock.ActualWidth) / 2);
Canvas.SetTop(WordBlock, (ContentPanel.ActualHeight - WordBlock.ActualHeight) / 2);
if (WordBlock.ActualWidth > ContentPanel.ActualWidth)
{
MarqueeAnimation.From = WordBlock.ActualWidth;
MarqueeAnimation.To = -WordBlock.ActualWidth;
MarqueeAnimation.Duration = new Duration(new TimeSpan(0, 0, 10));
MarqueeBoard.Begin();
}
}
Run Code Online (Sandbox Code Playgroud)
此方法称为OnNavigatedTo.我无法弄清楚为什么TextBlock
不会居中,因为ActualHeight
和ActualWidth
属性总是以0.0的形式返回.我不想放置固定大小,因为这是一个Windows应用商店应用程序,并希望它可以在不同的屏幕尺寸上进行扩展.
有任何想法吗?我被卡住了.
我对如何计算ActualWidth
或ActualHeight
工作或如何计算感到困惑.
<Ellipse Height="30" Width="30" Name="rightHand" Visibility="Collapsed">
<Ellipse.Fill>
<ImageBrush ImageSource="Images/Hand.png" />
</Ellipse.Fill>
</Ellipse>
Run Code Online (Sandbox Code Playgroud)
当我使用上面的代码时,我得到30 ActualWidth
和ActualHeight
.但是当我以编程方式定义一个椭圆时,即使我定义了(最大)高度和(最大)宽度属性,ActualWidth
并且ActualHeight
为0,我不明白它是如何为0的?
我试图创建一个自定义控件,具有半透明的圆形背景:
<Canvas>
<TextBlock x:Name="StopText" Text="Some test text"/>
<Rectangle Fill="SkyBlue"
Width="{Binding Source=StopText, Path=ActualHeight}"
Height="20"
RadiusX="5" RadiusY="5" Opacity="0.2"/>
</Canvas>
Run Code Online (Sandbox Code Playgroud)
问题是我不能绑定到ActualHeight
/ ActualWidth
properties,因为它们不是依赖项.
如何处理相同大小的矩形和文本框?
popUpControl
和listBoxControl
下面正在返回NaN
作为高度和宽度.这ActualHeight
也是0.0
为什么?更重要的是,解决方法是什么?
<Popup Name="popUpControl" IsOpen="True" VerticalAlignment="Top" HorizontalAlignment="Left" >
<ListBox Name="listBoxControl" SelectionChanged="_ListBox_SelectionChanged"
Style="{StaticResource ListBoxStyle}" BorderBrush="Transparent"
MaxHeight="300" MaxWidth="350" HorizontalContentAlignment="Stretch" VerticalContentAlignment="Stretch">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal" >
<TextBlock Text="{Binding ID}" VerticalAlignment="Center" Margin="2,0,0,0" />
<TextBlock Text="{Binding Name}" VerticalAlignment="Center" Margin="2,0,0,0" />
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</Popup>
Run Code Online (Sandbox Code Playgroud) actualheight ×11
actualwidth ×8
wpf ×8
xaml ×4
binding ×2
c# ×2
silverlight ×2
3d ×1
grid ×1
inkcanvas ×1
itemscontrol ×1
listbox ×1
reactjs ×1
scrollviewer ×1
selection ×1
wpf-controls ×1