WPFでレンダリングする前に、ビジュアル要素の論理幅を計算する必要があります。WPFビジュアルエレメントの論理幅はどのようにして計算できますか?
説明を簡単にするため、このビジュアル要素は多分Polygonオブジェクトであると言います。それは別のものかもしれませんが、Polygonは簡単に視覚化することができます。
だからXAMLは、このようになります:<Window x:Class="MyCLRNamespace.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
</Window>
そしてビハインドコードは次のようになります:
namespace MyCLRNamespace
{
public partial class Window1 : Window
{
public Window1()
{
InitializeComponent();
//This is the visual element in question. It's a simple triangle.
Polygon MyPolygon = new Polygon();
MyPolygon.Points = new PointCollection { new Point(100, 0),
new Point(200, 200),
new Point(0, 200) };
double PolyWidth = MyPolygon.Width;
/* In this case, PolyWidth will be set to double.NaN, since
MyPolygon.Width is never set.
I need to be able to calculate the logical width of an element,
unrelated to the WPF rendering system. This means that I can't
rely on FrameworkElement.ActualWidth to calculate the width for
me. I need to be able to look at the MyPolygon object (or its
content) and figure out that it is set to a visual element that
should be 200dips wide before any parent element applies any
operations to it - regardless of what MyPolygon.Width may or may
not be set to.
It should also be noted that I don't have to rely on
FrameorkElement. If there are more generic alternatives, such as
the UIElement or Visual classes, I'd prefer to use those instead
of the more specific FrameworkElement. The more robust I can make
this, the better. */
}
}
}
measureを呼び出した後で0,0が得られた場合は、ビジュアルツリーの要素のすぐ上にコンテナ要素を置き、その要素を測定できます。たぶん最善の解決策ではないかもしれませんが、あなたが絶望的であれば効果的です。 –