كيف أقوم بإنشاء حاوية WPF Rounded Corner؟
-
02-07-2019 - |
سؤال
نحن نقوم بإنشاء تطبيق XBAP ونحتاج إلى زوايا مستديرة في مواقع مختلفة في صفحة واحدة ونرغب في الحصول على حاوية WPF Rounded Corner لوضع مجموعة من العناصر الأخرى بداخلها.هل لدى أي شخص بعض الاقتراحات أو نماذج التعليمات البرمجية حول أفضل السبل لتحقيق ذلك؟إما مع الأنماط على أو مع إنشاء عنصر تحكم مخصص؟
المحلول
لا تحتاج إلى عنصر تحكم مخصص، فقط ضع الحاوية الخاصة بك في عنصر الحدود:
<Border BorderBrush="#FF000000" BorderThickness="1" CornerRadius="8">
<Grid/>
</Border>
يمكنك استبدال <Grid/>
مع أي من حاويات التخطيط...
نصائح أخرى
أعلم أن هذا ليس إجابة على السؤال الأولي ...لكنك غالبًا ما تريد قص المحتوى الداخلي لحد الزاوية المستديرة الذي أنشأته للتو.
لقد توصل كريس كافاناغ إلى طريقة ممتازة للقيام بهذا فقط.
لقد حاولت عدة طرق مختلفة لهذا ...وأعتقد أن هذا واحد الصخور.
هنا هو xaml أدناه:
<Page
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Background="Black"
>
<!-- Rounded yellow border -->
<Border
HorizontalAlignment="Center"
VerticalAlignment="Center"
BorderBrush="Yellow"
BorderThickness="3"
CornerRadius="10"
Padding="2"
>
<Grid>
<!-- Rounded mask (stretches to fill Grid) -->
<Border
Name="mask"
Background="White"
CornerRadius="7"
/>
<!-- Main content container -->
<StackPanel>
<!-- Use a VisualBrush of 'mask' as the opacity mask -->
<StackPanel.OpacityMask>
<VisualBrush Visual="{Binding ElementName=mask}"/>
</StackPanel.OpacityMask>
<!-- Any content -->
<Image Source="http://chriscavanagh.files.wordpress.com/2006/12/chriss-blog-banner.jpg"/>
<Rectangle
Height="50"
Fill="Red"/>
<Rectangle
Height="50"
Fill="White"/>
<Rectangle
Height="50"
Fill="Blue"/>
</StackPanel>
</Grid>
</Border>
</Page>
كان علي أن أفعل ذلك بنفسي، لذلك اعتقدت أنني سأقوم بنشر إجابة أخرى هنا.
إليك طريقة أخرى لإنشاء حدود زاوية مستديرة وقص محتواه الداخلي.هذه هي الطريقة المباشرة باستخدام خاصية Clip.إنه أمر جيد إذا كنت تريد تجنب VisualBrush.
الاكمل :
<Border
Width="200"
Height="25"
CornerRadius="11"
Background="#FF919194"
>
<Border.Clip>
<RectangleGeometry
RadiusX="{Binding CornerRadius.TopLeft, RelativeSource={RelativeSource AncestorType={x:Type Border}}}"
RadiusY="{Binding RadiusX, RelativeSource={RelativeSource Self}}"
>
<RectangleGeometry.Rect>
<MultiBinding
Converter="{StaticResource widthAndHeightToRectConverter}"
>
<Binding
Path="ActualWidth"
RelativeSource="{RelativeSource AncestorType={x:Type Border}}"
/>
<Binding
Path="ActualHeight"
RelativeSource="{RelativeSource AncestorType={x:Type Border}}"
/>
</MultiBinding>
</RectangleGeometry.Rect>
</RectangleGeometry>
</Border.Clip>
<Rectangle
Width="100"
Height="100"
Fill="Blue"
HorizontalAlignment="Left"
VerticalAlignment="Center"
/>
</Border>
كود المحول :
public class WidthAndHeightToRectConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
double width = (double)values[0];
double height = (double)values[1];
return new Rect(0, 0, width, height);
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}
التنفيذ القائم على كود VB.Net لحل مراقبة الحدود الخاص بـ kobusb.لقد استخدمته لملء ListBox بعناصر التحكم في الأزرار.يتم إنشاء عناصر التحكم في الأزرار من ملحقات MEF.يستخدم كل ملحق سمة ExportMetaData الخاصة بـ MEF للحصول على وصف للملحق.الامتدادات هي كائنات تخطيط VisiFire.يقوم المستخدم بالضغط على زر يتم اختياره من قائمة الأزرار لتنفيذ المخطط المطلوب.
' Create a ListBox of Buttons, one button for each MEF charting component.
For Each c As Lazy(Of ICharts, IDictionary(Of String, Object)) In ext.ChartDescriptions
Dim brdr As New Border
brdr.BorderBrush = Brushes.Black
brdr.BorderThickness = New Thickness(2, 2, 2, 2)
brdr.CornerRadius = New CornerRadius(8, 8, 8, 8)
Dim btn As New Button
AddHandler btn.Click, AddressOf GenericButtonClick
brdr.Child = btn
brdr.Background = btn.Background
btn.Margin = brdr.BorderThickness
btn.Width = ChartsLBx.ActualWidth - 22
btn.BorderThickness = New Thickness(0, 0, 0, 0)
btn.Height = 22
btn.Content = c.Metadata("Description")
btn.Tag = c
btn.ToolTip = "Push button to see " & c.Metadata("Description").ToString & " chart"
Dim lbi As New ListBoxItem
lbi.Content = brdr
ChartsLBx.Items.Add(lbi)
Next
Public Event Click As RoutedEventHandler
Private Sub GenericButtonClick(sender As Object, e As RoutedEventArgs)
Dim btn As Button = DirectCast(sender, Button)
Dim c As Lazy(Of ICharts, IDictionary(Of String, Object)) = DirectCast(btn.Tag, Lazy(Of ICharts, IDictionary(Of String, Object)))
Dim w As Window = DirectCast(c.Value, Window)
Dim cc As ICharts = DirectCast(c.Value, ICharts)
c.Value.CreateChart()
w.Show()
End Sub
<System.ComponentModel.Composition.Export(GetType(ICharts))> _
<System.ComponentModel.Composition.ExportMetadata("Description", "Data vs. Time")> _
Public Class DataTimeChart
Implements ICharts
Public Sub CreateChart() Implements ICharts.CreateChart
End Sub
End Class
Public Interface ICharts
Sub CreateChart()
End Interface
Public Class Extensibility
Public Sub New()
Dim catalog As New AggregateCatalog()
catalog.Catalogs.Add(New AssemblyCatalog(GetType(Extensibility).Assembly))
'Create the CompositionContainer with the parts in the catalog
ChartContainer = New CompositionContainer(catalog)
Try
ChartContainer.ComposeParts(Me)
Catch ex As Exception
Console.WriteLine(ex.ToString)
End Try
End Sub
' must use Lazy otherwise instantiation of Window will hold open app. Otherwise must specify Shutdown Mode of "Shutdown on Main Window".
<ImportMany()> _
Public Property ChartDescriptions As IEnumerable(Of Lazy(Of ICharts, IDictionary(Of String, Object)))
End Class
إذا كنت تحاول وضع زر في حدود مستطيلة مستديرة، فيجب عليك التحقق من ذلك مثال ام اس دي ان.لقد وجدت هذا من خلال البحث في Google عن صور المشكلة (بدلاً من النص).من السهل (لحسن الحظ) إزالة المستطيل الخارجي الضخم.
لاحظ أنه سيتعين عليك إعادة تعريف سلوك الزر (بما أنك قمت بتغيير ControlTemplate).أي أنك ستحتاج إلى تحديد سلوك الزر عند النقر عليه باستخدام علامة Trigger (Property="IsPressed" Value="true") في علامة ControlTemplate.Triggers.آمل أن ينقذ هذا شخصًا آخر الوقت الذي فقدته :)