WPF- এ হাইপারলিঙ্ক ব্যবহারের উদাহরণ using


160

আমি বেশ কয়েকটি পরামর্শ দেখেছি, আপনি Hyperlinkনিয়ন্ত্রণের মাধ্যমে ডাব্লুপিএফ অ্যাপ্লিকেশনটিতে হাইপারলিঙ্ক যুক্ত করতে পারেন ।

আমি এখানে আমার কোডটিতে এটি ব্যবহার করার চেষ্টা করছি:

<Window
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
        mc:Ignorable="d" 
        x:Class="BookmarkWizV2.InfoPanels.Windows.UrlProperties"
        Title="UrlProperties" Height="754" Width="576">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition></RowDefinition>
            <RowDefinition Height="40"/>
        </Grid.RowDefinitions>
        <Grid>
            <ScrollViewer ScrollViewer.VerticalScrollBarVisibility="Auto" Grid.RowSpan="2">
                <StackPanel >
                    <DockPanel LastChildFill="True" Margin="0,5">
                        <TextBlock Text="Url:" Margin="5" 
                            DockPanel.Dock="Left" VerticalAlignment="Center"/>
                        <TextBox Width="Auto">
                            <Hyperlink NavigateUri="http://www.google.co.in">
                                    Click here
                            </Hyperlink>   
                        </TextBox>                      
                    </DockPanel >
                </StackPanel>
            </ScrollViewer>        
        </Grid>
        <StackPanel HorizontalAlignment="Right" Orientation="Horizontal" Margin="0,7,2,7" Grid.Row="1" >
            <Button Margin="0,0,10,0">
                <TextBlock Text="Accept" Margin="15,3" />
            </Button>
            <Button Margin="0,0,10,0">
                <TextBlock Text="Cancel" Margin="15,3" />
            </Button>
        </StackPanel>
    </Grid>
</Window>

আমি নিম্নলিখিত ত্রুটি পাচ্ছি:

সম্পত্তি 'পাঠ্য' 'হাইপারলিঙ্ক' প্রকারের মানগুলিকে সমর্থন করে না।

আমি কি ভুল করছি?

উত্তর:


331

আপনি যদি একটি লিঙ্ক খুলুন আপনার আবেদন চান ওয়েব ব্রাউজার আপনি একটি যোগ করতে হবে হাইপারলিঙ্ক সঙ্গে RequestNavigate একটি ফাংশন যে প্রোগ্রামের মাধ্যমে একটি প্যারামিটার হিসাবে ঠিকানা দিয়ে একটি ওয়েব-ব্রাউজার খোলে ইভেন্ট সেট।

<TextBlock>           
    <Hyperlink NavigateUri="http://www.google.com" RequestNavigate="Hyperlink_RequestNavigate">
        Click here
    </Hyperlink>
</TextBlock>

কোড-পিছনে আপনাকে অনুরোধনাভিগেট ইভেন্টটি পরিচালনা করতে এর অনুরূপ কিছু যুক্ত করতে হবে।

private void Hyperlink_RequestNavigate(object sender, RequestNavigateEventArgs e)
{
    Process.Start(new ProcessStartInfo(e.Uri.AbsoluteUri));
    e.Handled = true;
}

এছাড়াও আপনার নিম্নলিখিত আমদানিগুলির প্রয়োজন হবে।

using System.Diagnostics;
using System.Windows.Navigation;

এটি আপনার অ্যাপ্লিকেশনটিতে এটি দেখতে হবে।

ওও


6
নোট: RequestNavigateEventArgsহয় System.Windows.Navigationনামস্থান।
বেন

2
ধন্যবাদ, তবে বাইন্ডিংয়ের মাধ্যমে লিংক-পাঠ্যটি (এই ক্ষেত্রে "এখানে ক্লিক করুন") নির্দিষ্ট করার কোনও উপায় আছে কি?
এজেন্ট 700

6
কেবল হাইপারলিংকের ভিতরে আবার একটি পাঠ্যরূপ স্থাপন করুন এবং পাঠ্যপ্রসারণকে আবদ্ধ করুন
ক্রোকএক্স

2
নোট # 2: Processএবং ProcessStartInfoউভয়ই System.Diagnosticsনেমস্পেসে রয়েছে।
ব্যবহারকারী 2023861

3
গুরুত্বপূর্ণ মন্তব্য : আপনার অবশ্যই একটি খালি খালি নেভিগেটআউরি বা ইভেন্ট রিকোয়েস্টনাভিগেট কখনই ডাকা হবে না
MuiBienCarlota

60

ফুজির প্রতিক্রিয়া ছাড়াও, আমরা হ্যান্ডেলারটিকে এটিকে সংযুক্ত সম্পত্তিতে পরিণত করতে পুনরায় ব্যবহারযোগ্য করে তুলতে পারি:

public static class HyperlinkExtensions
{
    public static bool GetIsExternal(DependencyObject obj)
    {
        return (bool)obj.GetValue(IsExternalProperty);
    }

    public static void SetIsExternal(DependencyObject obj, bool value)
    {
        obj.SetValue(IsExternalProperty, value);
    }
    public static readonly DependencyProperty IsExternalProperty =
        DependencyProperty.RegisterAttached("IsExternal", typeof(bool), typeof(HyperlinkExtensions), new UIPropertyMetadata(false, OnIsExternalChanged));

    private static void OnIsExternalChanged(object sender, DependencyPropertyChangedEventArgs args)
    {
        var hyperlink = sender as Hyperlink;

        if ((bool)args.NewValue)
            hyperlink.RequestNavigate += Hyperlink_RequestNavigate;
        else
            hyperlink.RequestNavigate -= Hyperlink_RequestNavigate;
    }

    private static void Hyperlink_RequestNavigate(object sender, System.Windows.Navigation.RequestNavigateEventArgs e)
    {
        Process.Start(new ProcessStartInfo(e.Uri.AbsoluteUri));
        e.Handled = true;
    }
}

এবং এটি এর মতো ব্যবহার করুন:

<TextBlock>
<Hyperlink NavigateUri="http://stackoverflow.com" custom::HyperlinkExtensions.IsExternal="true">
       Click here
    </Hyperlink>
 </TextBlock>

মার্জিত সমাধান। ধন্যবাদ
জেসন মারতাজায়া

30

Hyperlinkহয় না একটি নিয়ন্ত্রণ, এটি একটি হল প্রবাহ বিষয়বস্তু উপাদান, আপনি শুধুমাত্র এটা নিয়ন্ত্রণ যা সমর্থন প্রবাহ বিষয়বস্তু ব্যবহার করতে পারেন, একটি মত TextBlockTextBoxesশুধুমাত্র সরল পাঠ্য আছে।


26

আপনি যদি পরে স্ট্রিংকে স্থানীয়করণ করতে চান তবে সেই উত্তরগুলি যথেষ্ট নয়, আমি এরকম কিছু প্রস্তাব দেব:

<TextBlock>
    <Hyperlink NavigateUri="http://labsii.com/">
       <Hyperlink.Inlines>
            <Run Text="Click here"/>
       </Hyperlink.Inlines>
   </Hyperlink>
</TextBlock>

21

আইএমএইচও এর সহজ উপায় হ'ল উত্তরাধিকার সূত্রে প্রাপ্ত নতুন নিয়ন্ত্রণ ব্যবহার করা Hyperlink:

/// <summary>
/// Opens <see cref="Hyperlink.NavigateUri"/> in a default system browser
/// </summary>
public class ExternalBrowserHyperlink : Hyperlink
{
    public ExternalBrowserHyperlink()
    {
        RequestNavigate += OnRequestNavigate;
    }

    private void OnRequestNavigate(object sender, RequestNavigateEventArgs e)
    {
        Process.Start(new ProcessStartInfo(e.Uri.AbsoluteUri));
        e.Handled = true;
    }
}

16

নোটও যে Hyperlinkনেভিগেশন জন্য ব্যবহার করতে হবে না। আপনি এটি একটি কমান্ডের সাথে সংযুক্ত করতে পারেন।

উদাহরণ স্বরূপ:

<TextBlock>
  <Hyperlink Command="{Binding ClearCommand}">Clear</Hyperlink>
</TextBlock>

16

আমি এই প্রশ্নের উত্তরটি ব্যবহার করেছি এবং আমি এটি দিয়ে ইস্যু পেয়েছি।

এটি ব্যতিক্রম ফিরে: {"The system cannot find the file specified."}

কিছুটা তদন্ত শেষে। এটা পরিনত হয় যে যদি আপনার WPF আবেদন .CORE আপনি করতে হবে UseShellExecuteকরতে true

মাইক্রোসফ্ট ডক্সে এটি উল্লেখ করা হয়েছে :

প্রক্রিয়া শুরু করার সময় শেলটি ব্যবহার করা উচিত যদি সত্য; মিথ্যা যদি প্রক্রিয়াটি এক্সিকিউটেবল ফাইল থেকে সরাসরি তৈরি করা উচিত। .NET ফ্রেমওয়ার্ক অ্যাপ্লিকেশনগুলিতে ডিফল্ট সত্য এবং নেট নেট অ্যাপ্লিকেশনগুলিতে মিথ্যা।

সুতরাং এই কাজটি করতে আপনাকে যুক্ত UseShellExecuteকরতে হবে true:

Process.Start(new ProcessStartInfo(e.Uri.AbsoluteUri){ UseShellExecute = true });

আমার এই একই সমস্যা ছিল এবং এটি এখানে কীভাবে ঠিক করা যায় তা দেখতে এখানে এসেছি, তবে এটি এখনও UseShelExecute = trueকেন কোনও ধারণা নিয়েই আছে ?
হাই প্লেন গ্রিফটার

@ হাইপ্লেইনস গ্রিফটারটি ঠিক কীভাবে বুঝতে পেরে আপনি ইউজশেলএক্সেকুট = সত্য করেছেন তবে এখনও একই সমস্যা আছে? যদি এটি হয় তবে অ্যাডমিন মোডে আপনার ভিজ্যুয়াল স্টুডিওটি চালানোর চেষ্টা করুন (প্রশাসক হিসাবে চালান) আমি মনে করি এই প্রক্রিয়াটি এমন সংস্থানগুলিতে অ্যাক্সেস করা দরকার যা অ্যাডমিনের অধিকারের প্রয়োজন হয়। এবং এই সত্যটি জিনিসটি কেবল .कोर প্রকল্পগুলির জন্য বৈধ। যদি আমাকে সহায়তা করে তবে আমি আমার উত্তর আপডেট করতে পারি।
maytham-ɯɐɥʇʎɐɯ

হ্যাঁ, আমি আমার অ্যাডমিন ব্যবহারকারী হিসাবে Process.Start(new ProcessStartInfo(e.Uri.AbsoluteUri) { UseShellExecute = true });চলছি এবং "সিস্টেম.কম্পোনমেন্টমোডেল। উইন 32 এক্সসেপশন: ত্রুটি পেয়েছি: 'হাইপারলিংক অনুসরণ করার চেষ্টা করার সময় সিস্টেমটি নির্দিষ্ট করা ফাইলটি খুঁজে পাবে না
হাই প্লেনস গ্রিফটার

@ হাইপ্লেইনস গ্রিফটার এটি নিশ্চিত হতে পারে না অন্যটি কী হতে পারে, আপনার যদি সোর্স কোড থাকে তবে আমি এটির ডিবাগ করার জন্য কিছুটা সময় ব্যয় করতে চাই তবে কোনও বিষয়ে প্রতিশ্রুতি দেব না। :)
মায়থম - ɯɐɥʇʎɐɯ

দুঃখের সাথে সত্যিই শেয়ারযোগ্য কোড নয় - আমার এখনই হাইপারলিংকটি প্রকল্পটি ধরে রাখার পরিবর্তে ব্যবহার করা উচিত নয়। যাই হোক ধন্যবাদ.
হাই প্লেন গ্রিফটার

4

আমি পুনরায় ব্যবহারযোগ্য হ্যান্ডলার সম্পর্কে আর্থারের ধারণাটি পছন্দ করেছি তবে আমি মনে করি এটি করার আরও সহজ উপায় আছে:

private void Hyperlink_RequestNavigate(object sender, RequestNavigateEventArgs e)
{
    if (sender.GetType() != typeof (Hyperlink))
        return;
    string link = ((Hyperlink) sender).NavigateUri.ToString();
    Process.Start(link);
}

স্পষ্টতই যে কোনও প্রকার প্রক্রিয়া শুরু করার সাথে সাথে সুরক্ষা ঝুঁকি থাকতে পারে, তাই সতর্ক থাকুন।


1

আশা করি এটিও কাউকে সহায়তা করবে।

using System.Diagnostics;
using System.Windows.Documents;

namespace Helpers.Controls
{
    public class HyperlinkEx : Hyperlink
    {
        protected override void OnClick()
        {
            base.OnClick();

            Process p = new Process()
            {
                StartInfo = new ProcessStartInfo()
                {
                    FileName = this.NavigateUri.AbsoluteUri
                }
            };
            p.Start();
        }
    }
}

0

আমার মতে সর্বাধিক সুন্দর একটি উপায় (যেহেতু এটি এখন সাধারণভাবে পাওয়া যায়) আচরণগুলি ব্যবহার করা হচ্ছে।

এটি প্রয়োজন:

  • নুগেট নির্ভরতা: Microsoft.Xaml.Behaviors.Wpf
  • আপনার যদি ইতিমধ্যে অন্তর্নির্মিত আচরণ থাকে তবে আপনাকে মাইক্রোসফ্টস ব্লগে এই গাইডটি অনুসরণ করতে হতে পারে ।

এক্সএএমএল কোড:

xmlns:Interactions="http://schemas.microsoft.com/xaml/behaviors"

এবং

<Hyperlink NavigateUri="{Binding Path=Link}">
    <Interactions:Interaction.Behaviors>
        <behaviours:HyperlinkOpenBehaviour ConfirmNavigation="True"/>
    </Interactions:Interaction.Behaviors>
    <Hyperlink.Inlines>
        <Run Text="{Binding Path=Link}"/>
    </Hyperlink.Inlines>
</Hyperlink>

আচরণ কোড:

using System.Windows;
using System.Windows.Documents;
using System.Windows.Navigation;
using Microsoft.Xaml.Behaviors;

namespace YourNameSpace
{
    public class HyperlinkOpenBehaviour : Behavior<Hyperlink>
    {
        public static readonly DependencyProperty ConfirmNavigationProperty = DependencyProperty.Register(
            nameof(ConfirmNavigation), typeof(bool), typeof(HyperlinkOpenBehaviour), new PropertyMetadata(default(bool)));

        public bool ConfirmNavigation
        {
            get { return (bool) GetValue(ConfirmNavigationProperty); }
            set { SetValue(ConfirmNavigationProperty, value); }
        }

        /// <inheritdoc />
        protected override void OnAttached()
        {
            this.AssociatedObject.RequestNavigate += NavigationRequested;
            this.AssociatedObject.Unloaded += AssociatedObjectOnUnloaded;
            base.OnAttached();
        }

        private void AssociatedObjectOnUnloaded(object sender, RoutedEventArgs e)
        {
            this.AssociatedObject.Unloaded -= AssociatedObjectOnUnloaded;
            this.AssociatedObject.RequestNavigate -= NavigationRequested;
        }

        private void NavigationRequested(object sender, RequestNavigateEventArgs e)
        {
            if (!ConfirmNavigation || MessageBox.Show("Are you sure?", "Question", MessageBoxButton.YesNo, MessageBoxImage.Question) == MessageBoxResult.Yes)
            {
                OpenUrl();
            }

            e.Handled = true;
        }

        private void OpenUrl()
        {
//          Process.Start(new ProcessStartInfo(AssociatedObject.NavigateUri.AbsoluteUri));
            MessageBox.Show($"Opening {AssociatedObject.NavigateUri}");
        }

        /// <inheritdoc />
        protected override void OnDetaching()
        {
            this.AssociatedObject.RequestNavigate -= NavigationRequested;
            base.OnDetaching();
        }
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.