당신은 Geometry
에 Path.Data
를 데이터 바인딩에 의해 모양의 모든 방법을 그릴 수 있습니다. 포인트 목록에서 Geometry
을 생성 할 수 있습니다. A 컨버터는이 적응에 완벽합니다.
예를 들어, 내가보기 모델에 의해 관리 지점의 목록 떨어져 생성 StreamGeometry
에 Path.Data
속성을 데이터 바인딩에 의해 나선을 그리고 내 요구에 아주 잘 작동합니다
// ViewModel ...
public class ViewModel
{
[Notify]
public IList<Point> Points { get; set; }
}
// Converter ...
public class GeometryConverter : IValueConverter
{
public Object Convert(Object value, Type targetType, Object parameter, CultureInfo culture)
{
if (value == null || value == DependencyProperty.UnsetValue)
{
return value;
}
var points = (IList<Point>)value;
var i = 0;
var newPath = new StreamGeometry();
using (var context = newPath.Open())
{
var begun = false;
for (var i = 0; i < points.Count; i++)
{
var current = points[i];
if (!begun)
{
begun = true;
context.BeginFigure(current, true, false);
}
else
{
context.ArcTo(current, new Size(radius, radius), angle, false, SweepDirection.Counterclockwise, true, true);
}
}
}
newPath.Freeze();
return newPath.GetFlattenedPathGeometry();
}
}
XAML : TextBlock
요소를 결합하고 필요에 따라 'Canvas`에 사람을 배치 할 텍스트, 더 나은되지 않을 것에 관해서는
<Canvas>
<Path StrokeThickness="{Binding StrokeWidth}"
Canvas.Top="{Binding Top}"
Canvas.Left="{Binding Left}"
Data="{Binding Points, Converter={StaticResource GeometryConverter}}">
<Path.Stroke>
<SolidColorBrush Color="{Binding CurrentColor}" />
</Path.Stroke>
</Path>
</Canvas>
?
지연에 대해 유감스럽게 생각하지만 WPF에 새로 온 것입니다. 나는 현재 [이] (http://www.codeproject.com/Articles/85603/A-WPF-custom-control-for-zooming-and-panning?fid=1574482&df=90&mpp=25&noise=3&prof=False&sort=를 사용하고 위치 및보기 = 빠른 & spc = 긴장 및 fr = 1 # xx0xx) 확대/축소 및 이동. 당신은 텍스트 블록을 사용하는 것이 좋습니다,하지만 같은 ListBox에 다른 유형의 여러 요소를 바인딩하는 방법을 볼 수 없습니다. 내가 생각할 수있는 유일한 방법은 일종의 데이터 템플릿 전환입니다. –
디자인을 조금 변경했지만 ContentControl에 래핑 된 변환기를 사용하고 싶습니다. 방금 변환기를 추가하고 반경과 각도가 존재하지 않는다는 것을 알았습니다. 모양을 기반으로 추가해야하는 논리입니까? –
안녕하세요, 지연되어서 죄송합니다. 나는이 값들을 사용하는 기존의 코드에서 이것을 제거했다. 꼭 필요한 것은 아니며 직선 모양을 작성하는 경우에는 필요하지 않을 것입니다. 포인트 목록 만 있으면 'context.LineTo'만 호출하면됩니다. 커브가 필요하다면 목록의 포인트를 정의하는 방법이 필요합니다. 따라서 'context'의 올바른 메소드를 호출 할 수 있습니다. – codekaizen